Subversion Repositories Kolibri OS

Rev

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

  1.  
  2. struc VBE_VGAInfo {
  3.   .VESASignature          dd ?    ; char
  4.   .VESAVersion            dw ?    ; short
  5.   .OemStringPtr           dd ?    ; char *
  6.   .Capabilities           dd ?    ; ulong
  7.   .VideoModePtr           dd ?    ; ulong
  8.   .TotalMemory            dw ?    ; short
  9.   ; VBE 2.0+
  10.   .OemSoftwareRev         db ?    ; short
  11.   .OemVendorNamePtr       dw ?    ; char *
  12.   .OemProductNamePtr      dw ?    ; char *
  13.   .OemProductRevPtr       dw ?    ; char *
  14.   .reserved               rb 222  ; char
  15.   .OemData                rb 256  ; char
  16. }
  17.  
  18. struc VBE_ModeInfo {
  19.   .ModeAttributes         dw ?    ; short
  20.   .WinAAttributes         db ?    ; char
  21.   .WinBAttributes         db ?    ; char
  22.   .WinGranularity         dw ?    ; short
  23.   .WinSize                dw ?    ; short
  24.   .WinASegment            dw ?    ; ushort
  25.   .WinBSegment            dw ?    ; ushort
  26.   .WinFuncPtr             dd ?    ; void *
  27.   .BytesPerScanLine       dw ?    ; short
  28.   .XRes                   dw ?    ; short
  29.   .YRes                   dw ?    ; short
  30.   .XCharSize              db ?    ; char
  31.   .YCharSize              db ?    ; char
  32.   .NumberOfPlanes         db ?    ; char
  33.   .BitsPerPixel           db ?    ; char
  34.   .NumberOfBanks          db ?    ; char
  35.   .MemoryModel            db ?    ; char
  36.   .BankSize               db ?    ; char
  37.   .NumberOfImagePages     db ?    ; char
  38.   .res1                   db ?    ; char
  39.   .RedMaskSize            db ?    ; char
  40.   .RedFieldPosition       db ?    ; char
  41.   .GreenMaskSize          db ?    ; char
  42.   .GreenFieldPosition     db ?    ; char
  43.   .BlueMaskSize           db ?    ; char
  44.   .BlueFieldPosition      db ?    ; char
  45.   .RsvedMaskSize          db ?    ; char
  46.   .RsvedFieldPosition     db ?    ; char
  47.   .DirectColorModeInfo    db ?    ; char ; MISSED IN THIS TUTORIAL!! SEE ABOVE
  48.   ; VBE 2.0+
  49.   .PhysBasePtr            dd ?    ; ulong
  50.   .OffScreenMemOffset     dd ?    ; ulong
  51.   .OffScreenMemSize       dw ?    ; short
  52.   ; VBE 3.0+
  53.   .LinbytesPerScanLine    dw ?    ; short
  54.   .BankNumberOfImagePages db ?    ; char
  55.   .LinNumberOfImagePages  db ?    ; char
  56.   .LinRedMaskSize         db ?    ; char
  57.   .LinRedFieldPosition    db ?    ; char
  58.   .LingreenMaskSize       db ?    ; char
  59.   .LinGreenFieldPosition  db ?    ; char
  60.   .LinBlueMaskSize        db ?    ; char
  61.   .LinBlueFieldPosition   db ?    ; char
  62.   .LinRsvdMaskSize        db ?    ; char
  63.   .LinRsvdFieldPosition   db ?    ; char
  64.   .MaxPixelClock          dd ?    ; ulong
  65.   .res2                   rb 190  ; char
  66. }
  67.  
  68. virtual at $A000
  69.   vi VBE_VGAInfo
  70.   mi VBE_ModeInfo
  71.   modes_table:
  72. end virtual
  73.  
  74. ln_top db 1
  75. ln_num db 6
  76. ln_cnt db ?
  77. db ?
  78.  
  79. ln_top2 db ?
  80. ln_num2 db ?
  81. ln_cnt2 db ?
  82. db ?
  83.  
  84. vm_row db 2
  85. vm_col db 2
  86.  
  87. print_vesa_info:
  88.         push    0
  89.         pop     es
  90.  
  91.         _setcursor 3,2
  92.  
  93.         mov     [es:vi.VESASignature],'VBE2'
  94.         mov     ax,$4F00
  95.         mov     di,vi
  96.         int     $10
  97.         or      ah,ah
  98.         jz      @f
  99.         mov     [es:vi.VESASignature],'VESA'
  100.         mov     ax,$4F00
  101.         mov     di,vi
  102.         int     $10
  103.         or      ah,ah
  104.         jnz     .exit
  105.   @@:
  106.         cmp     [es:vi.VESASignature],'VESA'
  107.         jne     .exit
  108.         cmp     [es:vi.VESAVersion],$0100
  109.         jb      .exit
  110.         jmp     .vesaok2
  111.  
  112.   .exit:
  113.         ;pushad
  114.         push    0
  115.         pop     es
  116.         mov     si,novesa-0x10000
  117.         call    printplain
  118.         ret
  119.         ;pushw   'bb'
  120.         ;jmp     enum_modes.modes_ok
  121.  
  122.   .vesaok2:
  123.         mov     ecx,0x00200000
  124.         mov     ax,[es:vi.TotalMemory]
  125.         shr     ax,4
  126.         mov     bl,10
  127.         div     bl
  128.         mov     ch,ah
  129.         and     ax,0x00FF
  130.         div     bl
  131.         shl     ecx,8
  132.         mov     cx,ax
  133.         add     ecx,'000'
  134.  
  135.         mov     ax,[es:vi.VESAVersion]
  136.         add     ax,'00'
  137.  
  138.         push    0x1000
  139.         pop     es
  140.         mov     [es:s_vesa.ver-0x10000], ah
  141.         mov     [es:s_vesa.ver+2-0x10000], al
  142.         mov     dword[es:s_vesa.mem-0x10000],ecx
  143.         mov     si,s_vesa-0x10000
  144.         call    printplain
  145.  
  146. if 0 ; mm
  147.         _setcursor 5,2
  148.         mov     si,_oem-0x10000
  149.         call    printplain
  150. end if ; mm
  151.  
  152.         push    0
  153.         pop     es
  154.         mov     si,word[es:vi.OemStringPtr]
  155.         mov     di,si
  156.         push    word[es:vi.OemStringPtr+2]
  157.         pop     es
  158. if 0 ; mm
  159. ;       mov     al,0x0A
  160.         pop     es
  161.         mov     ax,es
  162.         mov     ds,ax
  163.         call    printplain
  164.         pop     es
  165. end if ; mm
  166.         push    0x1000
  167.         pop     ds
  168.         mov     si,s_ven_intel-0x10000
  169.         call    substr
  170.         mov     al,1
  171.         je      .vendor_ok
  172.         mov     si,s_ven_s3-0x10000
  173.         call    substr
  174.         mov     al,2
  175.         je      .vendor_ok
  176.         mov     al,3
  177.   .vendor_ok:
  178.         push    0 0x1000
  179.         pop     ds es
  180.         mov     [es:0x9035],al
  181.         ret
  182.  
  183. ;-----------------------------------------------------------------------------
  184.  
  185. calc_vmodes_table:
  186.         push    0 0x1000
  187.         pop     ds es
  188.         ;movzx   eax,byte [es:preboot_graph-0x10000]
  189.         ;cmp     eax,0
  190.         ;jne     pre_graph
  191.         ;_setcursor 9,2
  192.         ;mov     si,gr_mode-0x10000
  193.         ;call    printplain
  194.   .enum_modes:
  195.         pushad
  196.         push    0x0000
  197.         pop     es
  198.         ;mov     si,s_mode1-0x10000
  199.         ;call    printplain
  200.         mov     si,word[es:vi.VideoModePtr]
  201.         push    word[es:vi.VideoModePtr+2]
  202.         pop     fs
  203.         ;pushw   1
  204.  
  205.         mov     bx,modes_table;-0x10000
  206.   .next_mode:
  207.         mov     cx,[fs:si] ; mode number
  208.         cmp     cx,-1
  209.         je      .modes_ok.2
  210.  
  211.         mov     ax,$4F01
  212.         mov     di,mi
  213.         int     $10
  214.  
  215.         or      ah,ah
  216.         jnz     .modes_ok.2;vesa_info.exit
  217.         test    [es:mi.ModeAttributes],00000001b
  218.         jz      @f
  219.         test    [es:mi.ModeAttributes],00010000b
  220.         jz      @f
  221.  
  222.         cmp     [es:mi.BitsPerPixel],16
  223.         jne     .l0
  224.         cmp     [es:mi.GreenMaskSize],5
  225.         jne     .l0
  226.         mov     [es:mi.BitsPerPixel],15
  227.   .l0:
  228.  
  229.         cmp     [es:mi.XRes],640
  230.         jb      @f
  231.         cmp     [es:mi.YRes],480
  232.         jb      @f
  233.         cmp     [es:mi.BitsPerPixel],15
  234.         jb      @f
  235.  
  236.         mov     ax,[es:mi.XRes]
  237.         mov     [es:bx+0],ax               ; +0[2] : resolution X
  238.         mov     ax,[es:mi.YRes]
  239.         mov     [es:bx+2],ax               ; +2[2] : resolution Y
  240.         mov     ax,[es:mi.ModeAttributes]
  241.         mov     [es:bx+4],ax               ; +4[2] : attributes
  242.         cmp     [s_vesa.ver-0x10000],'2'
  243.         jb      .lp1
  244.         or      cx,0x4000  ; use LFB
  245.   .lp1: mov     [es:bx+6],cx               ; +6[2] : mode number
  246.         mov     al,[es:mi.BitsPerPixel]
  247.         mov     [es:bx+8],al               ; +8[1] : bits per pixel
  248.  
  249.         add     bx,10
  250.  
  251.     @@:
  252.         add     si,2
  253.         jmp     .next_mode
  254.  
  255.   .modes_ok.2:
  256.  
  257.         mov     si,modes_table;-0x10000;m_info
  258.  
  259.     @@: add     si,10
  260.         cmp     si,bx
  261.         jae     @f
  262.         mov     ax,[es:si+0-10]
  263.         cmp     ax,[es:si+0]
  264.         ja      .xch
  265.         jb      @b
  266.         mov     ax,[es:si+2-10]
  267.         cmp     ax,[es:si+2]
  268.         ja      .xch
  269.         jb      @b
  270.         mov     al,[es:si+8-10]
  271.         cmp     al,[es:si+8]
  272.         ja      .xch
  273.         jb      @b
  274.         pushad
  275.   .del: push    dword[es:si+0] dword[es:si+4]  word[es:si+8] dword[es:si+0+10] dword[es:si+4+10]  word[es:si+8+10]
  276.         pop      word[es:si+8] dword[es:si+4] dword[es:si+0]  word[es:si+8+10] dword[es:si+4+10] dword[es:si+0+10]
  277.         add     si,10
  278.         cmp     si,bx
  279.         jb      .del
  280.         popad
  281.         mov     si,modes_table
  282.         sub     bx,10
  283.         jmp     @b
  284.   .xch: push    dword[es:si+0] dword[es:si+4]  word[es:si+8] dword[es:si+0-10] dword[es:si+4-10]  word[es:si+8-10]
  285.         pop      word[es:si+8] dword[es:si+4] dword[es:si+0]  word[es:si+8-10] dword[es:si+4-10] dword[es:si+0-10]
  286.         mov     si,modes_table;-0x10000;m_info
  287.         jmp     @b
  288.  
  289.     @@:
  290.  
  291.         push    0
  292.         pop     es
  293.         mov     word[es:bx],-1
  294.         mov     si,modes_table
  295.         mov     di,0x0AC00
  296.         pushw   [es:si+2] [es:si+0]
  297.         mov     bp,sp
  298.         mov     [ds:ln_cnt],0
  299.         mov     word[es:si-10],0
  300.         jmp     .wr.2
  301.  
  302.     @@:
  303.         cmp     word[es:si-10],-1
  304.         je      @f
  305.  
  306.         mov     ax,[es:si+0]
  307.         cmp     ax,[ss:bp+0]
  308.         jne     .wr
  309.         mov     ax,[es:si+2]
  310.         cmp     ax,[ss:bp+2]
  311.         jne     .wr
  312.  
  313.   .ww:  mov     al,[es:si+8]
  314.         mov     bx,4
  315.         cmp     al,4
  316.         je      .l1
  317.         add     bx,4
  318.         cmp     al,8
  319.         je      .l1
  320.         add     bx,4
  321.         cmp     al,15
  322.         je      .l1
  323.         add     bx,4
  324.         cmp     al,16
  325.         je      .l1
  326.         add     bx,4
  327.         cmp     al,24
  328.         je      .l1
  329.         add     bx,4
  330.   .l1:  mov     eax,[es:si+4]      ; mode attributes & number
  331.         mov     [es:di+bx],eax
  332.  
  333.         add     si,10
  334.         jmp     @b
  335.  
  336.   .wr:
  337.         pushw   [ss:bp+0] [ss:bp+2]
  338.         popw    [es:di+2] [es:di+0]
  339.         add     di,4+6*4
  340.         inc     [ds:ln_cnt]
  341.         pushw   [es:si+0] [es:si+2]
  342.         popw    [ss:bp+2] [ss:bp+0]
  343.   .wr.2:
  344.         mov     cx,(4+6*4)/2
  345.         xor     ax,ax
  346.         push    di
  347.         cld
  348.         rep     stosw
  349.         pop     di
  350.         jmp     .ww
  351.  
  352.     @@: add     sp,4
  353.         popad
  354.         ret
  355.  
  356. ;-----------------------------------------------------------------------------
  357.  
  358. vm_bpp db 4,8,15,16,24,32
  359.  
  360. draw_current_vmode:
  361.         push    es ds 0 0x1000
  362.         pop     es ds
  363.         movzx   ax,[es:vm_row]
  364.         mov     dx,4+6*4
  365.         mul     dx
  366.         mov     si,ax
  367.         add     si,0x0AC00
  368.         mov     di,0x0A000
  369.         movzx   eax,word[si+0]
  370.         mov     ecx,10
  371.         call    int2strnz
  372.         mov     byte[ds:di],'x'
  373.         inc     di
  374.         movzx   eax,word[si+2]
  375.         call    int2strnz
  376.         mov     byte[ds:di],'x'
  377.         inc     di
  378.         movzx   bx,[es:vm_col]
  379.         movzx   eax,[es:bx+vm_bpp]
  380.         call    int2strnz
  381.         mov     byte[ds:di],0
  382.         mov     si,0x0A000
  383.         call    printplain
  384.         pop     ds es
  385.         ret
  386.  
  387. ;-----------------------------------------------------------------------------
  388.  
  389. draw_vmodes_table:
  390.         _setcursor 9,2
  391.         mov     si,gr_mode-0x10000
  392.         call    printplain
  393.         ;mov    ah,9
  394.         ;mov    dx,_tl
  395.         ;int    $21
  396.         mov     si,_tl-0x10000
  397.         call    printplain
  398.         push    0
  399.         pop     es
  400.         movzx   ax,[ds:ln_top]
  401.         mov     dx,4+6*4
  402.         mul     dx
  403.         mov     si,ax
  404.         add     si,0x0AC00
  405.  
  406.         mov     eax,dword[ds:ln_top]
  407.         mov     dword[ds:ln_top2],eax ; top+num+cnt
  408.  
  409.         movzx   cx,[ds:ln_num2]
  410.     @@: push    cx
  411.  
  412.         movzx   eax,word[es:si+0]
  413.         mov     di,_rs-0x10000+2+14
  414.         mov     ecx,10
  415.         mov     bl,4
  416.         call    int2str
  417.         movzx   eax,word[es:si+2]
  418.         inc     di
  419.         mov     bl,4
  420.         call    int2str
  421.  
  422.         add     si,4
  423.         add     di,4
  424.         mov     cx,6
  425.   .lp0: mov     al,' '
  426.         cmp     word[es:si],0
  427.         je      .lp1
  428.         mov     al,0xFB ; check
  429.   .lp1: mov     [ds:di],al
  430.         add     si,4
  431.         add     di,6
  432.         loop    .lp0
  433.  
  434.         push    si
  435.         mov     si,_rs-0x10000
  436.         call    printplain
  437.         pop     si
  438.  
  439.         pop     cx
  440.         loop    @b
  441.  
  442.         mov     si,_bt-0x10000
  443.         call    printplain
  444.         ret
  445.  
  446. ;-----------------------------------------------------------------------------
  447.  
  448. draw_vmodes_table_cursor: ; 9+5
  449.         mov     al,[vm_row]
  450.         sub     al,[ln_top]
  451.         add     al,13
  452.         mov     dh,al
  453.         mov     al,[vm_col]
  454.         mov     dl,6
  455.         mul     dl
  456.         add     al,28
  457.         mov     dl,al
  458.         call    setcursor
  459.         mov     si,_sel1-0x10000
  460.         mov     [si],ch
  461.         call    printplain
  462.         add     dl,2
  463.         call    setcursor
  464.         mov     si,_sel2-0x10000
  465.         mov     [si],cl
  466.         call    printplain
  467.         dec     dl
  468.         call    setcursor
  469.         ret
  470.  
  471. ;-----------------------------------------------------------------------------
  472.  
  473. macro qwe
  474. {
  475.   pushad
  476.   pushfd
  477.   push es ds 0 0x1000
  478.   pop ds es
  479.   mov si,badsect-2-0x10000
  480.   call printplain
  481.   pop ds es
  482.   popfd
  483.   popad
  484. }
  485.  
  486. set_vmode:
  487.         push    0 0x1000
  488.         pop     ds es
  489.         movzx   ax,[ds:vm_row]
  490.         mov     dx,4+6*4
  491.         mul     dx
  492.         add     ax,0x0AC00
  493.         mov     si,ax
  494.         mov     cx,[es:si+0]            ; resolution X
  495.         mov     dx,[es:si+2]            ; resolution Y
  496.         movzx   bx,[ds:vm_col]
  497.         shl     bx,2
  498.         mov     bx,[es:si+4+bx+2]         ; mode number
  499.  
  500. ;        mov     bx,0x4118
  501. ;        mov     cx,1024
  502. ;        mov     dx,768
  503. ;        mov     byte[es:0x9000],24
  504.  
  505.         cmp     bx,0x12
  506.         je      .gml00
  507.         cmp     bx,0x13
  508.         je      .sgml1
  509.  
  510.         movzx   bp,[ds:vm_col]
  511.         mov     al,[ds:bp+vm_bpp]
  512.         mov     [es:0x9000],al
  513.         jmp     .gml10
  514.  
  515.        .sgml1:
  516.         mov     [es:0x9000],byte 32
  517.         jmp     .gml10
  518.  
  519.        .gml00:
  520.         mov     [es:0x9000],byte 4
  521.  
  522.     .gml10:
  523.         mov     [es:0x9008],bx
  524.         mov     [es:0x900A],cx
  525.         mov     [es:0x900C],dx
  526.         mov     al,[s_vesa.ver-0x10000]
  527.         mov     [es:0x9034],al
  528. ;       push    0x1000
  529. ;       pop     es
  530.         mov     [s_bpp.bpp-0x10000],'8 '
  531.         cmp     bx,0x13
  532.         je      .bppl;nov
  533.         mov     [s_bpp.bpp-0x10000],'4 '
  534.         cmp     bx,0x12
  535.         je      .bppl;nov
  536.  
  537. ; bx - mode : cx - x size : dx - y size
  538.  
  539. ; FIND VESA 2.0 LFB & BPP
  540.  
  541.         mov     ax,0x4f01
  542.         mov     cx,bx
  543.         and     cx,0xfff
  544.         push    0x0000
  545.         pop     es
  546.         mov     di,mi;0xa000
  547.         int     0x10
  548.         ; LFB
  549.         mov     eax,[es:mi.PhysBasePtr];di+0x28]
  550.         mov     [es:0x9018],eax
  551.         ; BPP
  552. ;        cmp     [es:mi.BitsPerPixel],16
  553. ;        jne     .l0
  554. ;        cmp     [es:mi.GreenMaskSize],5
  555. ;        jne     .l0
  556. ;        mov     [es:mi.BitsPerPixel],15
  557. ;  .l0:  mov     al,[es:mi.BitsPerPixel];di+0x19]
  558. ;        mov     [es:0x9000],al
  559.         ; ---- vbe voodoo
  560.         ;BytesPerScanLine equ 0x10
  561.         push ax
  562.         mov ax, [es:mi.BytesPerScanLine];di+BytesPerScanLine]
  563.         mov [es:0x9001],ax
  564.         pop ax
  565.         ; -----
  566.     .nov:
  567.         mov     al,[es:0x9000]
  568.  
  569.         cmp     al,15
  570.         jnz     .nbpp15
  571.         mov     [s_bpp.bpp-0x10000],'15'
  572.         jmp     .bppl
  573.     .nbpp15:
  574.         cmp     al,16
  575.         jnz     .nbpp16
  576.         mov     [s_bpp.bpp-0x10000],'16'
  577.         jmp     .bppl
  578.     .nbpp16:
  579.         cmp     al,24
  580.         jnz     .nbpp24
  581.         mov     [s_bpp.bpp-0x10000],'24'
  582.         jmp     .bppl
  583.     .nbpp24:
  584.         cmp     al,32
  585.         jnz     .nbpp32
  586.         mov     [s_bpp.bpp-0x10000],'32'
  587.         jmp     .bppl
  588.     .nbpp32:
  589.         mov     [s_bpp.bpp-0x10000],'??'
  590.         mov     si,s_bpp-0x10000
  591.         call    printplain
  592.         jmp     $
  593.     .bppl:
  594.         mov     si,s_bpp-0x10000
  595.         call    printplain
  596.  
  597.  
  598. ; FIND VESA 1.2 PM BANK SWITCH ADDRESS
  599.  
  600.         cmp     [s_vesa.ver-0x10000],'2'
  601.         jb      @f
  602.  
  603.         mov     ax,0x4f0A
  604.         mov     bx,0x0
  605.         int     0x10
  606.         xor     eax,eax
  607.         xor     ebx,ebx
  608.         mov     ax,es
  609.         shl     eax,4
  610.         mov     bx,di
  611.         add     eax,ebx
  612.         movzx   ebx,word[es:di]
  613.         add     eax,ebx
  614.         push    0x0000
  615.         pop     es
  616.         mov     [es:0x9014],eax
  617.         jmp     .lp1
  618.     @@:
  619.  
  620.         mov     dword[es:0x9018],0x000A0000
  621.   .lp1:
  622.  
  623.         ret
  624.  
  625. ;=============================================================================
  626. ;=============================================================================
  627. ;=============================================================================
  628.  
  629. ; DISPLAY VESA INFORMATION
  630. vesa_info:
  631. macro sdfawgsgwaew {
  632.         push    0
  633.         pop     es
  634.  
  635.         mov     [es:vi.VESASignature],'VBE2'
  636.         mov     ax,$4F00
  637.         mov     di,vi
  638.         int     $10
  639.         or      ah,ah
  640.         jz      @f
  641.         mov     [es:vi.VESASignature],'VESA'
  642.         mov     ax,$4F00
  643.         mov     di,vi
  644.         int     $10
  645.         or      ah,ah
  646.         jnz     .exit
  647.   @@:
  648.         cmp     [es:vi.VESASignature],'VESA'
  649.         jne     .exit
  650.         cmp     [es:vi.VESAVersion],$0100
  651.         jb      .exit
  652.         jmp     vesaok2
  653.  
  654.   .exit:
  655.         pushad
  656.         push    0
  657.         pop     es
  658.         mov     si,s_mode1-0x10000
  659.         call    printplain
  660. ;       mov     si,word[es:vi.VideoModePtr]
  661. ;       push    word[es:vi.VideoModePtr+2]
  662. ;       pop     fs
  663.         pushw   'bb'
  664.         jmp     enum_modes.modes_ok
  665. ;       push    0x1000
  666. ;       pop     es
  667. ;       mov     si,novesa-0x10000
  668. ;       call    print
  669. ;       mov     ax,16
  670. ;       jmp     $;novesafound
  671.  
  672.   vesaok2:
  673.         mov     ecx,0x00200000
  674.         mov     ax,[es:vi.TotalMemory]
  675.         shr     ax,4
  676.         mov     bl,10
  677.         div     bl
  678.         mov     ch,ah
  679.         and     ax,0x00FF
  680.         div     bl
  681.         shl     ecx,8
  682.         mov     cx,ax
  683.         add     ecx,'000'
  684.  
  685.         mov     ax,[es:vi.VESAVersion]
  686.         add     ax,'00'
  687.  
  688.         push    0x1000
  689.         pop     es
  690.         mov     [es:s_vesa.ver-0x10000], ah
  691.         mov     [es:s_vesa.ver+2-0x10000], al
  692.         mov     dword[es:s_vesa.mem-0x10000],ecx
  693.         mov     si,s_vesa-0x10000
  694.         call    print
  695.  
  696. ;// mike.dld, 2005-08-20 [
  697.         mov     si,_oem-0x10000
  698.         call    print
  699.  
  700.         push    0
  701.         pop     es
  702.         mov     si,word[es:vi.OemStringPtr]
  703.         mov     di,si
  704.         push    word[es:vi.OemStringPtr+2]
  705.         pop     es
  706.         mov     al,0x0A
  707.         push    es
  708.         call    draw_text
  709.         pop     es
  710.  
  711.         push    0x1000
  712.         pop     ds
  713.         mov     si,s_ven_intel-0x10000
  714.         call    substr
  715.         mov     al,1
  716.         je      vendor_ok
  717.         mov     si,s_ven_s3-0x10000
  718.         call    substr
  719.         mov     al,2
  720.         je      vendor_ok
  721.         mov     al,3
  722.   vendor_ok:
  723.         push    0 0x1000
  724.         pop     ds es
  725.         mov     [es:0x9035],al
  726. ;// mike.dld, 2005-08-20 ]
  727.  
  728.       novesafound:
  729. ;!!     call    setbase1000
  730.  
  731. ; ASK GRAPHICS MODE
  732.  
  733.         movzx   eax,byte [es:preboot_graph-0x10000]
  734.         cmp     eax,0
  735.         jne     pre_graph
  736.         mov     si,gr_mode-0x10000
  737.         call    printplain
  738.   enum_modes:
  739.         pushad
  740.         push    0x0000
  741.         pop     es
  742.         mov     si,s_mode1-0x10000
  743.         call    printplain
  744.         mov     si,word[es:vi.VideoModePtr]
  745.         push    word[es:vi.VideoModePtr+2]
  746.         pop     fs
  747.         pushw   1
  748.  
  749.         mov     bx,modes_table;-0x10000
  750.   .next_mode:
  751.         mov     cx,[fs:si] ; mode number
  752.         cmp     cx,-1
  753.         je      .modes_ok.2
  754.  
  755.         mov     ax,$4F01
  756.         mov     di,mi
  757.         int     $10
  758.  
  759.         or      ah,ah
  760.         jnz     .modes_ok.2;vesa_info.exit
  761.         test    [es:mi.ModeAttributes],00000001b
  762.         jz      @f
  763.         test    [es:mi.ModeAttributes],00010000b
  764.         jz      @f
  765.  
  766.         cmp     [es:mi.BitsPerPixel],16
  767.         jne     .l0
  768.         cmp     [es:mi.GreenMaskSize],5
  769.         jne     .l0
  770.         mov     [es:mi.BitsPerPixel],15
  771.   .l0:
  772.  
  773.         cmp     [es:mi.XRes],640
  774.         jb      @f
  775.         cmp     [es:mi.YRes],480
  776.         jb      @f
  777.         cmp     [es:mi.BitsPerPixel],15
  778.         jb      @f
  779.  
  780.         mov     ax,[es:mi.XRes]
  781.         mov     [es:bx+0],ax
  782.         mov     ax,[es:mi.YRes]
  783.         mov     [es:bx+2],ax
  784.         mov     ax,[es:mi.ModeAttributes]
  785.         mov     [es:bx+4],ax
  786.         cmp     [s_vesa.ver-0x10000],'2'
  787.         jb      .lp1
  788.         or      cx,0x4000  ; use LFB
  789.   .lp1: mov     [es:bx+6],cx
  790.         mov     al,[es:mi.BitsPerPixel]
  791.         mov     [es:bx+8],al
  792.  
  793.         add     bx,10
  794.  
  795.     @@:
  796.         add     si,2
  797.         jmp     .next_mode
  798.  
  799.   .modes_ok.2:
  800.  
  801.         mov     si,modes_table;-0x10000;m_info
  802.  
  803.     @@: add     si,10
  804.         cmp     si,bx
  805.         jae     @f
  806.         mov     ax,[es:si+0-10]
  807.         cmp     ax,[es:si+0]
  808.         ja      .xch
  809.         jb      @b
  810.         mov     ax,[es:si+2-10]
  811.         cmp     ax,[es:si+2]
  812.         ja      .xch
  813.         jb      @b
  814.         mov     al,[es:si+8-10]
  815.         cmp     al,[es:si+8]
  816.         ja      .xch
  817.         jb      @b
  818.         pushad
  819.   .del: push    dword[es:si+0] dword[es:si+4]  word[es:si+8] dword[es:si+0+10] dword[es:si+4+10]  word[es:si+8+10]
  820.         pop      word[es:si+8] dword[es:si+4] dword[es:si+0]  word[es:si+8+10] dword[es:si+4+10] dword[es:si+0+10]
  821.         add     si,10
  822.         cmp     si,bx
  823.         jb      .del
  824.         popad
  825.         mov     si,modes_table
  826.         sub     bx,10
  827.         jmp     @b
  828.   .xch: push    dword[es:si+0] dword[es:si+4]  word[es:si+8] dword[es:si+0-10] dword[es:si+4-10]  word[es:si+8-10]
  829.         pop      word[es:si+8] dword[es:si+4] dword[es:si+0]  word[es:si+8-10] dword[es:si+4-10] dword[es:si+0-10]
  830.         mov     si,modes_table;-0x10000;m_info
  831.         jmp     @b
  832.  
  833.     @@: ;mov    ah,9
  834.         ;mov    dx,_tl
  835.         ;int    $21
  836.         mov     si,_tl-0x10000
  837.         push    bx
  838.         call    printplain
  839.         pop     bx
  840.         push    0
  841.         pop     es
  842.         mov     word[es:bx],-1
  843.         mov     si,modes_table;-0x10000;m_info
  844.         pushw   [es:si+0] [es:si+2] 'c'
  845.         mov     bp,sp
  846.  
  847.     @@:
  848.         cmp     word[es:si-10],-1
  849.         je      @f
  850. ;       cmp     si,bx
  851. ;       jae     @f
  852.         mov     ax,[es:si+0]
  853.         cmp     ax,[ss:bp+4]
  854.         jne     .wr
  855.         mov     ax,[es:si+2]
  856.         cmp     ax,[ss:bp+2]
  857.         jne     .wr
  858.  
  859.   .ww:  push    bx
  860.         movzx   eax,word[es:si+0]
  861.         mov     di,_rs-0x10000+2
  862.         mov     ecx,10
  863.         mov     bl,4
  864.         call    int2str
  865.         movzx   eax,word[es:si+2]
  866.         inc     di
  867.         mov     bl,4
  868.         call    int2str
  869.  
  870.         mov     al,[es:si+8]
  871.         mov     di,_rs-0x10000+16
  872.         cmp     al,4
  873.         je      .l1
  874.         add     di,5
  875.         cmp     al,8
  876.         je      .l1
  877.         add     di,5
  878.         cmp     al,15
  879.         je      .l1
  880.         add     di,5
  881.         cmp     al,16
  882.         je      .l1
  883.         add     di,5
  884.         cmp     al,24
  885.         je      .l1
  886.         add     di,5
  887.   .l1:  mov     al,[ss:bp]
  888.         cmp     byte[ds:di],'-'
  889.         jne     .lp0
  890.         mov     [ds:di],al
  891.         inc     byte[ss:bp]
  892.         jmp     .lp2
  893.   .lp0:
  894.   .lp2:
  895.         pop     bx
  896.         add     si,10
  897.         jmp     @b;.sk
  898.  
  899.   .wr:  ;mov    ah,9
  900.         ;mov    dx,_rs
  901.         ;int    $21
  902.         push    bx si
  903.         mov     si,_rs-0x10000
  904.         call    printplain
  905.         pop     si bx
  906.  
  907.         mov     byte[ds:_rs-0x10000+16+5*0],'-'
  908.         mov     byte[ds:_rs-0x10000+16+5*1],'-'
  909.         mov     byte[ds:_rs-0x10000+16+5*2],'-'
  910.         mov     byte[ds:_rs-0x10000+16+5*3],'-'
  911.         mov     byte[ds:_rs-0x10000+16+5*4],'-'
  912.         mov     byte[ds:_rs-0x10000+16+5*5],'-'
  913.  
  914.         pushw   [es:si+0] [es:si+2]
  915.         popw    [ss:bp+2] [ss:bp+4]
  916.  
  917.   .sk:
  918.         jmp     .ww;@b
  919.  
  920.     @@: ;add    sp,6
  921.  
  922.         pop     bx
  923.         add     sp,6
  924.         sub     bl,2
  925.         shl     bx,8
  926.         push    bx
  927. ;       mov     ah,9
  928. ;       mov     dx,_bt
  929. ;       int     $21
  930.         mov     si,_bt-0x10000
  931.         call    printplain
  932.  
  933.   .modes_ok:
  934.         pop     bx
  935.         mov     bp,sp
  936.         mov     [ss:bp+4*4],bx
  937.         popad
  938.  
  939.        gml0:
  940.         mov     bl,'a'
  941.         call    getkey ; !! getchar
  942.        pre_graph:
  943.         or      al,al
  944.         jz      gml00
  945.         cmp     al,1
  946.         je      sgml1
  947.         ;shl    ax,4
  948.         sub     ax,2
  949.         mov     si,10
  950.         mul     si
  951.         add     ax,modes_table;-0x10000
  952.         mov     si,ax
  953.         mov     bx,[es:si+6]
  954.         mov     cx,[es:si+0]
  955.         mov     dx,[es:si+2]
  956.         jmp     gml10
  957.        sgml1:
  958. ;        cmp     al,9
  959. ;        jnz     gml00
  960.         mov     bx,0x13
  961.         mov     cx,640
  962.         mov     dx,480
  963.         push    0x0
  964.         pop     es
  965.         mov     [es:0x9000],byte 32
  966. ;        push    0x1000
  967. ;        pop     es
  968.         jmp     gml10
  969.        gml00:
  970. ;        cmp     al,0xa
  971. ;        jnz     gml02
  972.         mov     bx,0x12
  973.         mov     cx,640
  974.         mov     dx,480
  975.         push    0x0
  976.         pop     es
  977.         mov     [es:0x9000],byte 4;32
  978.  
  979.     gml10:
  980.         push    0x0000
  981.         pop     es
  982.         mov     [es:0x9008],bx
  983.         mov     [es:0x900A],cx
  984.         mov     [es:0x900C],dx
  985.         mov     al,[s_vesa.ver-0x10000]
  986.         mov     [es:0x9034],al
  987.         push    0x1000
  988.         pop     es
  989.         mov     [s_bpp.bpp-0x10000],'8 '
  990.         cmp     bx,0x13
  991.         je      .bppl;nov
  992.         mov     [s_bpp.bpp-0x10000],'4 '
  993.         cmp     bx,0x12
  994.         je      .bppl;nov
  995.  
  996. ; bx - mode : cx - x size : dx - y size
  997.  
  998. ; FIND VESA 2.0 LFB & BPP
  999.  
  1000.         mov     ax,0x4f01
  1001.         mov     cx,bx
  1002.         and     cx,0xfff
  1003.         push    0x0000
  1004.         pop     es
  1005.         mov     di,mi;0xa000
  1006.         int     0x10
  1007.         ; LFB
  1008.         mov     eax,[es:mi.PhysBasePtr];di+0x28]
  1009.         mov     [es:0x9018],eax
  1010.         ; BPP
  1011.         cmp     [es:mi.BitsPerPixel],16
  1012.         jne     .l0
  1013.         cmp     [es:mi.GreenMaskSize],5
  1014.         jne     .l0
  1015.         mov     [es:mi.BitsPerPixel],15
  1016.   .l0:  mov     al,[es:mi.BitsPerPixel];di+0x19]
  1017.         mov     [es:0x9000],al
  1018.         ; ---- vbe voodoo
  1019.         ;BytesPerScanLine equ 0x10
  1020.         push ax
  1021.         mov ax, [es:mi.BytesPerScanLine];di+BytesPerScanLine]
  1022.         mov [es:0x9001],ax
  1023.         pop ax
  1024.         ; -----
  1025.     .nov:
  1026.         cmp     al,15
  1027.         jnz     .nbpp15
  1028.         mov     [s_bpp.bpp-0x10000],'15'
  1029.         jmp     .bppl
  1030.     .nbpp15:
  1031.         cmp     al,16
  1032.         jnz     .nbpp16
  1033.         mov     [s_bpp.bpp-0x10000],'16'
  1034.         jmp     .bppl
  1035.     .nbpp16:
  1036.         cmp     al,24
  1037.         jnz     .nbpp24
  1038.         mov     [s_bpp.bpp-0x10000],'24'
  1039.         jmp     .bppl
  1040.     .nbpp24:
  1041.         cmp     al,32
  1042.         jnz     .nbpp32
  1043.         mov     [s_bpp.bpp-0x10000],'32'
  1044.         jmp     .bppl
  1045.     .nbpp32:
  1046.         mov     [s_bpp.bpp-0x10000],'??'
  1047.         call    print
  1048.         jmp     $
  1049.     .bppl:
  1050.         mov     si,s_bpp-0x10000
  1051.         call    printplain
  1052.  
  1053.  
  1054. ; FIND VESA 1.2 PM BANK SWITCH ADDRESS
  1055.  
  1056.         cmp     [s_vesa.ver-0x10000],'2'
  1057.         jb      @f
  1058.  
  1059.         mov     ax,0x4f0A
  1060.         mov     bx,0x0
  1061.         int     0x10
  1062.         xor     eax,eax
  1063.         xor     ebx,ebx
  1064.         mov     ax,es
  1065.         shl     eax,4
  1066.         mov     bx,di
  1067.         add     eax,ebx
  1068.         movzx   ebx,word[es:di]
  1069.         add     eax,ebx
  1070.         push    0x0000
  1071.         pop     es
  1072.         mov     [es:0x9014],eax
  1073.         jmp     .lp1
  1074.     @@:
  1075.  
  1076.         mov     dword[es:0x9018],0x000A0000
  1077.   .lp1:
  1078.         push    0x1000
  1079.         pop     es
  1080. }
  1081.