VirtualBox

Ignore:
Timestamp:
Oct 23, 2007 7:03:55 PM (17 years ago)
Author:
vboxsync
Message:

Synced with updated VGA/VESA BIOS.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Graphics/BIOS/vbe.c

    r3290 r5450  
    3131
    3232// defines available
    33 // enable LFB support
    34 #define VBE_HAVE_LFB
    3533
    3634// disable VESA/VBE2 check in vbe info
    3735//#define VBE2_NO_VESA_CHECK
    38 
    39 // dynamicly generate a mode_info list
    40 #define DYN_LIST
    4136
    4237// use bytewise i/o by default (Longhorn issue)
     
    5045
    5146#include "vbe.h"
    52 #include "vbetables.h"
    5347
    5448
     
    6054extern char vbebios_product_name;
    6155extern char vbebios_product_revision;
    62 
    63 #ifndef DYN_LIST
    64 extern Bit16u vbebios_mode_list;
    65 #endif
    6656
    6757ASM_START
     
    10494
    10595
    106 #ifndef DYN_LIST
    107 // FIXME: for each new mode add a statement here
    108 //        at least until dynamic list creation is working
    109 _vbebios_mode_list:
    110 
    111 .word VBE_VESA_MODE_640X400X8
    112 .word VBE_VESA_MODE_640X480X8
    113 .word VBE_VESA_MODE_800X600X4
    114 .word VBE_VESA_MODE_800X600X8
    115 .word VBE_VESA_MODE_1024X768X8
    116 .word VBE_VESA_MODE_640X480X1555
    117 .word VBE_VESA_MODE_640X480X565
    118 .word VBE_VESA_MODE_640X480X888
    119 .word VBE_VESA_MODE_800X600X1555
    120 .word VBE_VESA_MODE_800X600X565
    121 .word VBE_VESA_MODE_800X600X888
    122 .word VBE_VESA_MODE_1024X768X1555
    123 .word VBE_VESA_MODE_1024X768X565
    124 .word VBE_VESA_MODE_1024X768X888
    125 .word VBE_OWN_MODE_640X480X8888
    126 .word VBE_OWN_MODE_800X600X8888
    127 .word VBE_OWN_MODE_1024X768X8888
    128 .word VBE_OWN_MODE_320X200X8
    129 .word VBE_VESA_MODE_END_OF_LIST
    130 #endif
     96  .align 2
     97vesa_pm_start:
     98  dw vesa_pm_set_window - vesa_pm_start
     99  dw vesa_pm_set_display_start - vesa_pm_start
     100  dw vesa_pm_unimplemented - vesa_pm_start
     101  dw vesa_pm_io_ports_table - vesa_pm_start
     102vesa_pm_io_ports_table:
     103  dw VBE_DISPI_IOPORT_INDEX
     104  dw VBE_DISPI_IOPORT_INDEX + 1
     105  dw VBE_DISPI_IOPORT_DATA
     106  dw VBE_DISPI_IOPORT_DATA + 1
     107  dw 0xffff
     108  dw 0xffff
     109
     110  USE32
     111vesa_pm_set_window:
     112  cmp  bx, #0x00
     113  je  vesa_pm_set_display_window1
     114  mov  ax, #0x0100
     115  ret
     116vesa_pm_set_display_window1:
     117  mov  ax, dx
     118  push dx
     119  push ax
     120  mov  dx, # VBE_DISPI_IOPORT_INDEX
     121  mov  ax, # VBE_DISPI_INDEX_BANK
     122  out  dx, ax
     123  pop  ax
     124  mov  dx, # VBE_DISPI_IOPORT_DATA
     125  out  dx, ax
     126  in   ax, dx
     127  pop  dx
     128  cmp  dx, ax
     129  jne  illegal_window
     130  mov  ax, #0x004f
     131  ret
     132illegal_window:
     133  mov  ax, #0x014f
     134  ret
     135vesa_pm_set_display_start:
     136  cmp  bl, #0x80
     137  je   vesa_pm_set_display_start1
     138  cmp  bl, #0x00
     139  je   vesa_pm_set_display_start1
     140  mov  ax, #0x0100
     141  ret
     142vesa_pm_set_display_start1:
     143; convert offset to (X, Y) coordinate
     144; (would be simpler to change Bochs VBE API...)
     145  push eax
     146  push ecx
     147  push edx
     148  push esi
     149  push edi
     150  shl edx, #16
     151  and ecx, #0xffff
     152  or ecx, edx
     153  shl ecx, #2
     154  mov eax, ecx
     155  push eax
     156  mov  dx, # VBE_DISPI_IOPORT_INDEX
     157  mov  ax, # VBE_DISPI_INDEX_VIRT_WIDTH
     158  out  dx, ax
     159  mov  dx, # VBE_DISPI_IOPORT_DATA
     160  in   ax, dx
     161  movzx ecx, ax
     162  mov  dx, # VBE_DISPI_IOPORT_INDEX
     163  mov  ax, # VBE_DISPI_INDEX_BPP
     164  out  dx, ax
     165  mov  dx, # VBE_DISPI_IOPORT_DATA
     166  in   ax, dx
     167  movzx esi, ax
     168  pop  eax
     169
     170  cmp esi, #4
     171  jz bpp4_mode
     172  add esi, #7
     173  shr esi, #3
     174  imul ecx, esi
     175  xor edx, edx
     176  div ecx
     177  mov edi, eax
     178  mov eax, edx
     179  xor edx, edx
     180  div esi
     181  jmp set_xy_regs
     182
     183bpp4_mode:
     184  shr ecx, #1
     185  xor edx, edx
     186  div ecx
     187  mov edi, eax
     188  mov eax, edx
     189  shl eax, #1
     190
     191set_xy_regs:
     192  push dx
     193  push ax
     194  mov  dx, # VBE_DISPI_IOPORT_INDEX
     195  mov  ax, # VBE_DISPI_INDEX_X_OFFSET
     196  out  dx, ax
     197  pop  ax
     198  mov  dx, # VBE_DISPI_IOPORT_DATA
     199  out  dx, ax
     200  pop  dx
     201
     202  mov  ax, di
     203  push dx
     204  push ax
     205  mov  dx, # VBE_DISPI_IOPORT_INDEX
     206  mov  ax, # VBE_DISPI_INDEX_Y_OFFSET
     207  out  dx, ax
     208  pop  ax
     209  mov  dx, # VBE_DISPI_IOPORT_DATA
     210  out  dx, ax
     211  pop  dx
     212
     213  pop edi
     214  pop esi
     215  pop edx
     216  pop ecx
     217  pop eax
     218  mov  ax, #0x004f
     219  ret
     220
     221vesa_pm_unimplemented:
     222  mov ax, #0x014f
     223  ret
     224  USE16
     225vesa_pm_end:
    131226
    132227;; Bytewise in/out
     
    210305  out  dx, ax
    211306#endif
    212   push ax
    213   mov  dx, #0x03d4
    214   mov  ax, #0x0011
    215 #ifdef VBE_BYTEWISE_IO
    216   call out_dx_ax
    217 #else
    218   out  dx, ax
    219 #endif
    220   mov  dx, #0x03d4
    221   pop  ax
    222   push ax
    223   shr  ax, #3
    224   dec  ax
    225   mov  ah, al
    226   mov  al, #0x01
    227 #ifdef VBE_BYTEWISE_IO
    228   call out_dx_ax
    229 #else
    230   out  dx, ax
    231 #endif
    232   pop  ax
    233   call vga_set_virt_width
    234 
    235307  pop  dx
    236308  pop  ax
     
    333405  ret
    334406
     407; get display capabilities
     408
     409_dispi_get_max_xres:
     410  push dx
     411  push bx
     412  call dispi_get_enable
     413  mov  bx, ax
     414  or   ax, # VBE_DISPI_GETCAPS
     415  call _dispi_set_enable
     416  mov  dx, # VBE_DISPI_IOPORT_INDEX
     417  mov  ax, # VBE_DISPI_INDEX_XRES
     418#ifdef VBE_BYTEWISE_IO
     419  call out_dx_ax
     420#else
     421  out  dx, ax
     422#endif
     423  mov  dx, # VBE_DISPI_IOPORT_DATA
     424#ifdef VBE_BYTEWISE_IO
     425  call in_ax_dx
     426#else
     427  in   ax, dx
     428#endif
     429  push ax
     430  mov  ax, bx
     431  call _dispi_set_enable
     432  pop  ax
     433  pop  bx
     434  pop  dx
     435  ret
     436
    335437_dispi_get_max_bpp:
    336438  push dx
     
    445547  or bx,bx
    446548  jnz dispi_set_bank_farcall_error
    447   push dx
     549  mov ax, dx
     550  push dx
     551  push ax
    448552  mov ax,# VBE_DISPI_INDEX_BANK
    449553  mov dx,# VBE_DISPI_IOPORT_INDEX
     
    460564  out dx,ax
    461565#endif
     566#ifdef VBE_BYTEWISE_IO
     567  call in_ax_dx
     568#else
     569  in  ax,dx
     570#endif
     571  pop dx
     572  cmp dx,ax
     573  jne dispi_set_bank_farcall_error
     574  mov ax, #0x004f
    462575  retf
    463576dispi_set_bank_farcall_get:
     
    568681  cmp  al, #0x04
    569682  ja   set_width_svga
    570   shr  bx, #2
     683  shr  bx, #1
    571684set_width_svga:
    572   shr  bx, #2
    573   mov  dx, #0x03d4
     685  shr  bx, #3
     686  mov  dx, # VGAREG_VGA_CRTC_ADDRESS
    574687  mov  ah, bl
    575688  mov  al, #0x13
     
    640753  pop  dx
    641754  ret
     755
     756_vga_compat_setup:
     757  push ax
     758  push dx
     759
     760  ; set CRT X resolution
     761  mov  dx, # VBE_DISPI_IOPORT_INDEX
     762  mov  ax, # VBE_DISPI_INDEX_XRES
     763#ifdef VBE_BYTEWISE_IO
     764  call out_dx_ax
     765#else
     766  out  dx, ax
     767#endif
     768  mov  dx, # VBE_DISPI_IOPORT_DATA
     769#ifdef VBE_BYTEWISE_IO
     770  call in_ax_dx
     771#else
     772  in   ax, dx
     773#endif
     774  push ax
     775  mov  dx, # VGAREG_VGA_CRTC_ADDRESS
     776  mov  ax, #0x0011
     777#ifdef VBE_BYTEWISE_IO
     778  call out_dx_ax
     779#else
     780  out  dx, ax
     781#endif
     782  pop  ax
     783  push ax
     784  shr  ax, #3
     785  dec  ax
     786  mov  ah, al
     787  mov  al, #0x01
     788#ifdef VBE_BYTEWISE_IO
     789  call out_dx_ax
     790#else
     791  out  dx, ax
     792#endif
     793  pop  ax
     794  call vga_set_virt_width
     795
     796  ; set CRT Y resolution
     797  mov  dx, # VBE_DISPI_IOPORT_INDEX
     798  mov  ax, # VBE_DISPI_INDEX_YRES
     799#ifdef VBE_BYTEWISE_IO
     800  call out_dx_ax
     801#else
     802  out  dx, ax
     803#endif
     804  mov  dx, # VBE_DISPI_IOPORT_DATA
     805#ifdef VBE_BYTEWISE_IO
     806  call in_ax_dx
     807#else
     808  in   ax, dx
     809#endif
     810  dec  ax
     811  push ax
     812  mov  dx, # VGAREG_VGA_CRTC_ADDRESS
     813  mov  ah, al
     814  mov  al, #0x12
     815#ifdef VBE_BYTEWISE_IO
     816  call out_dx_ax
     817#else
     818  out  dx, ax
     819#endif
     820  pop  ax
     821  mov  al, #0x07
     822  out  dx, al
     823  inc  dx
     824  in   al, dx
     825  and  al, #0xbd
     826  test ah, #0x01
     827  jz   bit8_clear
     828  or   al, #0x02
     829bit8_clear:
     830  test ah, #0x02
     831  jz   bit9_clear
     832  or   al, #0x40
     833bit9_clear:
     834  out  dx, al
     835
     836  ; other settings
     837  mov  dx, # VGAREG_VGA_CRTC_ADDRESS
     838  mov  ax, #0x0009
     839#ifdef VBE_BYTEWISE_IO
     840  call out_dx_ax
     841#else
     842  out  dx, ax
     843#endif
     844  mov  al, #0x17
     845  out  dx, al
     846  mov  dx, # VGAREG_VGA_CRTC_DATA
     847  in   al, dx
     848  or   al, #0x03
     849  out  dx, al
     850  mov  dx, # VGAREG_ACTL_RESET
     851  in   al, dx
     852  mov  dx, # VGAREG_ACTL_ADDRESS
     853  mov  al, #0x10
     854  out  dx, al
     855  mov  dx, # VGAREG_ACTL_READ_DATA
     856  in   al, dx
     857  or   al, #0x01
     858  mov  dx, # VGAREG_ACTL_ADDRESS
     859  out  dx, al
     860  mov  al, #0x20
     861  out  dx, al
     862  mov  dx, # VGAREG_GRDC_ADDRESS
     863  mov  ax, #0x0506
     864#ifdef VBE_BYTEWISE_IO
     865  call out_dx_ax
     866#else
     867  out  dx, ax
     868#endif
     869  mov  dx, # VGAREG_SEQU_ADDRESS
     870  mov  ax, #0x0f02
     871#ifdef VBE_BYTEWISE_IO
     872  call out_dx_ax
     873#else
     874  out  dx, ax
     875#endif
     876
     877  ; settings for >= 8bpp
     878  mov  dx, # VBE_DISPI_IOPORT_INDEX
     879  mov  ax, # VBE_DISPI_INDEX_BPP
     880#ifdef VBE_BYTEWISE_IO
     881  call out_dx_ax
     882#else
     883  out  dx, ax
     884#endif
     885  mov  dx, # VBE_DISPI_IOPORT_DATA
     886#ifdef VBE_BYTEWISE_IO
     887  call in_ax_dx
     888#else
     889  in   ax, dx
     890#endif
     891  cmp  al, #0x08
     892  jb   vga_compat_end
     893  mov  dx, # VGAREG_VGA_CRTC_ADDRESS
     894  mov  al, #0x14
     895  out  dx, al
     896  mov  dx, # VGAREG_VGA_CRTC_DATA
     897  in   al, dx
     898  or   al, #0x40
     899  out  dx, al
     900  mov  dx, # VGAREG_ACTL_RESET
     901  in   al, dx
     902  mov  dx, # VGAREG_ACTL_ADDRESS
     903  mov  al, #0x10
     904  out  dx, al
     905  mov  dx, # VGAREG_ACTL_READ_DATA
     906  in   al, dx
     907  or   al, #0x40
     908  mov  dx, # VGAREG_ACTL_ADDRESS
     909  out  dx, al
     910  mov  al, #0x20
     911  out  dx, al
     912  mov  dx, # VGAREG_SEQU_ADDRESS
     913  mov  al, #0x04
     914  out  dx, al
     915  mov  dx, # VGAREG_SEQU_DATA
     916  in   al, dx
     917  or   al, #0x08
     918  out  dx, al
     919  mov  dx, # VGAREG_GRDC_ADDRESS
     920  mov  al, #0x05
     921  out  dx, al
     922  mov  dx, # VGAREG_GRDC_DATA
     923  in   al, dx
     924  and  al, #0x9f
     925  or   al, #0x40
     926  out  dx, al
     927
     928vga_compat_end:
     929  pop  dx
     930  pop  ax
    642931ASM_END
    643932
     
    7691058  pop  bx
    7701059  pop  ds
    771   mov  ax, # VBE_DISPI_ID3
     1060;  mov  ax, # VBE_DISPI_ID3
     1061  mov  ax, # VBE_DISPI_ID4
    7721062  call dispi_set_id
    7731063no_vbe_interface:
     1064#if defined(DEBUG)
    7741065  mov  bx, #msg_vbe_init
    7751066  push bx
     
    7771068  inc  sp
    7781069  inc  sp
    779   ret
    780 
     1070#endif
     1071  ret
     1072
     1073#ifndef VBOX
    7811074; VBE Display Info - Display information on screen about the VBE
    7821075
     
    7941087  mov  si, #_no_vbebios_info_string
    7951088  jmp  _display_string
     1089#endif
     1090
    7961091ASM_END
    7971092
     
    8201115        ModeInfoListItem  *cur_info; /* used to get the mode list offset. */
    8211116        Bit16u            sig, vmode;
     1117        Bit16u            max_bpp=dispi_get_max_bpp();
    8221118#else
    8231119        ModeInfoListItem  *cur_info=&mode_info_list;
    824 #endif
    825 #ifdef DYN_LIST
    826         Bit16u            max_bpp=dispi_get_max_bpp();
    8271120#endif
    8281121
     
    8901183        vbe_info_block.Capabilities[3] = 0;
    8911184
    892 #ifdef DYN_LIST
    8931185        // VBE Video Mode Pointer (dynamicly generated from the mode_info_list)
    8941186        vbe_info_block.VideoModePtr_Seg= ES ;
    8951187        vbe_info_block.VideoModePtr_Off= DI + 34;
    896 #else
    897         // VBE Video Mode Pointer (staticly in rom)
    898         vbe_info_block.VideoModePtr_Seg = 0xc000;
    899         vbe_info_block.VideoModePtr_Off = &vbebios_mode_list;
    900 #endif
    9011188
    9021189        // VBE Total Memory (in 64b blocks)
     
    9471234        write_word(ES, DI + cur_ptr, vmode);
    9481235#else
    949 #ifdef DYN_LIST
    9501236        do
    9511237        {
     
    9631249        // Add vesa mode list terminator
    9641250        write_word(ES, DI + cur_ptr, cur_info->mode);
    965 #endif
    9661251#endif // VBE_NEW_DYN_LIST
    9671252
     
    10951380                Bit16u data;
    10961381                Bit8u data_b;
    1097 #ifdef DEBUG
    10981382                Bit16u x, y;
    10991383                Bit8u bpp;
     
    11031387                bpp = in_byte(VBE_EXTRA_PORT, &cur_info->info.BitsPerPixel);
    11041388
     1389#ifdef DEBUG
    11051390                printf("VBE found mode %x, setting:\n", BX);
    11061391                printf("\txres%x yres%x bpp%x\n", x, y, bpp);
     
    11431428                dispi_set_bank(0);
    11441429                dispi_set_enable(VBE_DISPI_ENABLED | no_clear | lfb_flag);
     1430                vga_compat_setup();
    11451431
    11461432                write_word(BIOSMEM_SEG,BIOSMEM_VBE_MODE,BX);
     
    11931479ASM_END
    11941480
     1481Bit16u vbe_biosfn_read_video_state_size()
     1482{
     1483    return 9 * 2;
     1484}
     1485
     1486void vbe_biosfn_save_video_state(ES, BX)
     1487     Bit16u ES; Bit16u BX;
     1488{
     1489    Bit16u enable, i;
     1490
     1491    outw(VBE_DISPI_IOPORT_INDEX,VBE_DISPI_INDEX_ENABLE);
     1492    enable = inw(VBE_DISPI_IOPORT_DATA);
     1493    write_word(ES, BX, enable);
     1494    BX += 2;
     1495    if (!(enable & VBE_DISPI_ENABLED))
     1496        return;
     1497    for(i = VBE_DISPI_INDEX_XRES; i <= VBE_DISPI_INDEX_Y_OFFSET; i++) {
     1498        if (i != VBE_DISPI_INDEX_ENABLE) {
     1499            outw(VBE_DISPI_IOPORT_INDEX, i);
     1500            write_word(ES, BX, inw(VBE_DISPI_IOPORT_DATA));
     1501            BX += 2;
     1502        }
     1503    }
     1504}
     1505
     1506
     1507void vbe_biosfn_restore_video_state(ES, BX)
     1508     Bit16u ES; Bit16u BX;
     1509{
     1510    Bit16u enable, i;
     1511
     1512    enable = read_word(ES, BX);
     1513    BX += 2;
     1514   
     1515    if (!(enable & VBE_DISPI_ENABLED)) {
     1516        outw(VBE_DISPI_IOPORT_INDEX,VBE_DISPI_INDEX_ENABLE);
     1517        outw(VBE_DISPI_IOPORT_DATA, enable);
     1518    } else {
     1519        outw(VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_XRES);
     1520        outw(VBE_DISPI_IOPORT_DATA, read_word(ES, BX));
     1521        BX += 2;
     1522        outw(VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_YRES);
     1523        outw(VBE_DISPI_IOPORT_DATA, read_word(ES, BX));
     1524        BX += 2;
     1525        outw(VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_BPP);
     1526        outw(VBE_DISPI_IOPORT_DATA, read_word(ES, BX));
     1527        BX += 2;
     1528        outw(VBE_DISPI_IOPORT_INDEX,VBE_DISPI_INDEX_ENABLE);
     1529        outw(VBE_DISPI_IOPORT_DATA, enable);
     1530
     1531        for(i = VBE_DISPI_INDEX_BANK; i <= VBE_DISPI_INDEX_Y_OFFSET; i++) {
     1532            outw(VBE_DISPI_IOPORT_INDEX, i);
     1533            outw(VBE_DISPI_IOPORT_DATA, read_word(ES, BX));
     1534            BX += 2;
     1535        }
     1536    }
     1537}
    11951538
    11961539/** Function 04h - Save/Restore State
     
    12081551 *
    12091552 */
    1210 void vbe_biosfn_save_restore_state(AX, DL, CX, ES, BX)
     1553void vbe_biosfn_save_restore_state(AX, CX, DX, ES, BX)
     1554Bit16u *AX; Bit16u CX; Bit16u DX; Bit16u ES; Bit16u *BX;
    12111555{
     1556    Bit16u ss=get_SS();
     1557    Bit16u result, val;
     1558
     1559    result = 0x4f;
     1560    switch(GET_DL()) {
     1561    case 0x00:
     1562        val = biosfn_read_video_state_size2(CX);
     1563#ifdef DEBUG
     1564        printf("VGA state size=%x\n", val);
     1565#endif
     1566        if (CX & 8)
     1567            val += vbe_biosfn_read_video_state_size();
     1568        write_word(ss, BX, val);
     1569        break;
     1570    case 0x01:
     1571        val = read_word(ss, BX);
     1572        val = biosfn_save_video_state(CX, ES, val);
     1573#ifdef DEBUG
     1574        printf("VGA save_state offset=%x\n", val);
     1575#endif
     1576        if (CX & 8)
     1577            vbe_biosfn_save_video_state(ES, val);
     1578        break;
     1579    case 0x02:
     1580        val = read_word(ss, BX);
     1581        val = biosfn_restore_video_state(CX, ES, val);
     1582#ifdef DEBUG
     1583        printf("VGA restore_state offset=%x\n", val);
     1584#endif
     1585        if (CX & 8)
     1586            vbe_biosfn_restore_video_state(ES, val);
     1587        break;
     1588    default:
     1589        // function failed
     1590        result = 0x100;
     1591        break;
     1592    }
     1593    write_word(ss, AX, result);
    12121594}
    12131595
     
    12951677  xor  bh, bh
    12961678  mov  bl, ah
     1679  or   bl, bl
     1680  jnz  no_4bpp_1
     1681  shl  ax, #3
     1682  mov  bl, #1
     1683no_4bpp_1:
    12971684  xor  dx, dx
    12981685  pop  ax
     
    13061693  call dispi_get_virt_width
    13071694  mov  cx, ax
     1695  or   bl, bl
     1696  jnz  no_4bpp_2
     1697  shr  ax, #3
     1698  mov  bl, #1
     1699no_4bpp_2:
    13081700  mul  bx
    13091701  mov  bx, ax
     
    15221914ASM_END
    15231915
     1916
    15241917/** Function 0Ah - Return VBE Protected Mode Interface
    15251918 *
    1526  * Input:
    1527  *              AX      = 4F0Ah
    1528  * Output:
    1529  *              AX      = VBE Return Status
    1530  *
    1531  * FIXME: incomplete API description, Input & Output
     1919 * Input:    AX   = 4F0Ah   VBE 2.0 Protected Mode Interface
     1920 *           BL   = 00h          Return protected mode table
     1921 * Output:   AX   =         Status
     1922 *           ES   =         Real Mode Segment of Table
     1923 *           DI   =         Offset of Table
     1924 *           CX   =         Length of Table including protected mode code
     1925 *                          (for copying purposes)
    15321926 */
    1533 void vbe_biosfn_return_protected_mode_interface(AX)
    1534 {
    1535 }
     1927ASM_START
     1928vbe_biosfn_return_protected_mode_interface:
     1929  test bl, bl
     1930  jnz _fail
     1931  mov di, #0xc000
     1932  mov es, di
     1933  mov di, # vesa_pm_start
     1934  mov cx, # vesa_pm_end
     1935  sub cx, di
     1936  mov ax, #0x004f
     1937  ret
     1938_fail:
     1939  mov ax, #0x014f
     1940  ret
     1941ASM_END
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette