VirtualBox

Changeset 67548 in vbox for trunk/src


Ignore:
Timestamp:
Jun 21, 2017 8:46:31 PM (8 years ago)
Author:
vboxsync
Message:

VBIOS: Rewrote set/get scanline length function in C.

Location:
trunk/src/VBox/Devices/Graphics/BIOS
Files:
4 edited

Legend:

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

    r63595 r67548  
    128128    out_w(VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_BPP);
    129129    out_w(VBE_DISPI_IOPORT_DATA, bpp);
     130}
     131
     132static uint16_t dispi_get_bpp(void)
     133{
     134    out_w(VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_BPP);
     135    return in_w(VBE_DISPI_IOPORT_DATA);
     136}
     137
     138static void dispi_set_virt_width(uint16_t vwidth)
     139{
     140#ifdef VGA_DEBUG
     141    printf("vbe_set_virt_width: %04x\n", vwidth);
     142#endif
     143    out_w(VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_VIRT_WIDTH);
     144    out_w(VBE_DISPI_IOPORT_DATA, vwidth);
     145}
     146
     147static uint16_t dispi_get_virt_width(void)
     148{
     149    out_w(VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_VIRT_WIDTH);
     150    return in_w(VBE_DISPI_IOPORT_DATA);
     151}
     152
     153static uint16_t dispi_get_virt_height(void)
     154{
     155    out_w(VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_VIRT_HEIGHT);
     156    return in_w(VBE_DISPI_IOPORT_DATA);
    130157}
    131158
     
    691718    *AX = result;
    692719}
     720
     721/** Function 06h - Set/Get Logical Scan Line Length
     722 *
     723 *  Input:
     724 *              AX      = 4F06h
     725 *              BL      = 00h Set Scan Line Length in Pixels
     726 *                      = 01h Get Scan Line Length
     727 *                      = 02h Set Scan Line Length in Bytes
     728 *                      = 03h Get Maximum Scan Line Length
     729 *              CX      = If BL=00h Desired Width in Pixels
     730 *                        If BL=02h Desired Width in Bytes
     731 *                        (Ignored for Get Functions)
     732 *
     733 *  Output:
     734 *              AX      = VBE Return Status
     735 *              BX      = Bytes Per Scan Line
     736 *              CX      = Actual Pixels Per Scan Line (truncated to
     737 *                        nearest complete pixel)
     738 *              DX      = Maximum Number of Scan Lines
     739 */
     740void vbe_biosfn_get_set_scanline_length(uint16_t STACK_BASED *AX, uint16_t STACK_BASED *BX,
     741                                        uint16_t STACK_BASED *CX, uint16_t STACK_BASED *DX)
     742{
     743    uint16_t    val;
     744    uint16_t    result;
     745    uint8_t     bpp;
     746    uint8_t     subfn;
     747
     748    bpp    = dispi_get_bpp();
     749    result = 0x004F;
     750    val    = *CX;
     751    subfn  = *BX & 0xFF;
     752#ifdef VGA_DEBUG
     753    printf("VBE get/set scanline len fn=%x, CX=%x\n", subfn, *CX);
     754#endif
     755    switch(subfn) {
     756    case 0x02:
     757        if (bpp == 4)
     758            val = val * 8;
     759        else
     760            val = val / (bpp / 8);
     761        /* fall through */
     762    case 0x00:
     763        dispi_set_virt_width(val);
     764        /* fall through */
     765    case 0x01:
     766        val = dispi_get_virt_width();
     767        *CX = val;                          /* Width in pixels. */
     768        if (bpp == 4)
     769            val = val / 8;
     770        else
     771            val = val * (bpp / 8);
     772        val = (val + 3) & ~3;
     773        *BX = val;                          /* Bytes per scanline. */
     774        *DX = dispi_get_virt_height();      /* Height in lines. */
     775        break;
     776    default:
     777        // function failed
     778        result = 0x100;
     779        break;
     780    }
     781    *AX = result;
     782}
  • trunk/src/VBox/Devices/Graphics/BIOS/vberom.asm

    r63617 r67548  
    4949public  vbe_biosfn_return_current_mode
    5050public  vbe_biosfn_display_window_control
    51 public  vbe_biosfn_set_get_logical_scan_line_length
    5251public  vbe_biosfn_set_get_display_start
    5352public  vbe_biosfn_set_get_dac_palette_format
     
    304303  pop  bx
    305304  pop  ax
    306   ret
    307 
    308 dispi_set_virt_width:
    309   call vga_set_virt_width
    310   push dx
    311   push ax
    312   mov  dx, VBE_DISPI_IOPORT_INDEX
    313   mov  ax, VBE_DISPI_INDEX_VIRT_WIDTH
    314   out_dx_ax
    315   pop  ax
    316   mov  dx, VBE_DISPI_IOPORT_DATA
    317   out_dx_ax
    318   pop  dx
    319   ret
    320 
    321 dispi_get_virt_width:
    322   push dx
    323   mov  dx, VBE_DISPI_IOPORT_INDEX
    324   mov  ax, VBE_DISPI_INDEX_VIRT_WIDTH
    325   out_dx_ax
    326   mov  dx, VBE_DISPI_IOPORT_DATA
    327   in_ax_dx
    328   pop  dx
    329   ret
    330 
    331 dispi_get_virt_height:
    332   push dx
    333   mov  dx, VBE_DISPI_IOPORT_INDEX
    334   mov  ax, VBE_DISPI_INDEX_VIRT_HEIGHT
    335   out_dx_ax
    336   mov  dx, VBE_DISPI_IOPORT_DATA
    337   in_ax_dx
    338   pop  dx
    339305  ret
    340306
     
    569535vbe_05_failed:
    570536  mov  ax, 014Fh
    571   ret
    572 
    573 
    574 ; Function 06h - Set/Get Logical Scan Line Length
    575 ;
    576 ; Input:
    577 ;              AX      = 4F06h
    578 ;              BL      = 00h Set Scan Line Length in Pixels
    579 ;                      = 01h Get Scan Line Length
    580 ;                      = 02h Set Scan Line Length in Bytes
    581 ;                      = 03h Get Maximum Scan Line Length
    582 ;              CX      = If BL=00h Desired Width in Pixels
    583 ;                        If BL=02h Desired Width in Bytes
    584 ;                        (Ignored for Get Functions)
    585 ;
    586 ; Output:
    587 ;              AX      = VBE Return Status
    588 ;              BX      = Bytes Per Scan Line
    589 ;              CX      = Actual Pixels Per Scan Line
    590 ;                        (truncated to nearest complete pixel)
    591 ;              DX      = Maximum Number of Scan Lines
    592 ;
    593 vbe_biosfn_set_get_logical_scan_line_length:
    594   mov  ax, cx
    595   cmp  bl, 1
    596   je   get_logical_scan_line_length
    597   cmp  bl, 2
    598   je   set_logical_scan_line_bytes
    599   jb   set_logical_scan_line_pixels
    600   mov  ax, 0100h
    601   ret
    602 set_logical_scan_line_bytes:
    603   push ax
    604   call dispi_get_bpp
    605   xor  bh, bh
    606   mov  bl, ah
    607   or   bl, bl
    608   pop  ax
    609   jnz  no_4bpp_1
    610 if VBOX_BIOS_CPU gt 8086
    611   shl  ax, 3
    612 else
    613   shl  ax, 1
    614   shl  ax, 1
    615   shl  ax, 1
    616 endif
    617   mov  bl, 1
    618 no_4bpp_1:
    619   xor  dx, dx
    620   div  bx
    621 set_logical_scan_line_pixels:
    622   call dispi_set_virt_width
    623 get_logical_scan_line_length:
    624   call dispi_get_bpp
    625   xor  bh, bh
    626   mov  bl, ah
    627   call dispi_get_virt_width
    628   mov  cx, ax
    629   or   bl, bl
    630   jnz  no_4bpp_2
    631 if VBOX_BIOS_CPU gt 8086
    632   shr  ax, 3
    633 else
    634   shr  ax, 1
    635   shr  ax, 1
    636   shr  ax, 1
    637 endif
    638   mov  bl, 1
    639 no_4bpp_2:
    640   mul  bx
    641   mov  bx, ax
    642   call dispi_get_virt_height
    643   mov  dx, ax
    644   mov  ax, 004Fh
    645537  ret
    646538
  • trunk/src/VBox/Devices/Graphics/BIOS/vgabios.c

    r63562 r67548  
    21002100extern void vbe_biosfn_set_mode(uint16_t STACK_BASED *AX, uint16_t BX, uint16_t ES, uint16_t DI);
    21012101extern void vbe_biosfn_save_restore_state(uint16_t STACK_BASED *AX, uint16_t CX, uint16_t DX, uint16_t ES, uint16_t STACK_BASED *BX);
     2102extern void vbe_biosfn_get_set_scanline_length(uint16_t STACK_BASED *AX, uint16_t STACK_BASED *BX, uint16_t STACK_BASED *CX, uint16_t STACK_BASED *DX);
    21022103
    21032104// --------------------------------------------------------------------------------------------
     
    22952296          vbe_biosfn_save_restore_state(&AX, CX, DX, ES, &BX);
    22962297          break;
     2298         case 0x06:
     2299          vbe_biosfn_get_set_scanline_length(&AX, &BX, &CX, &DX);
     2300          break;
    22972301         case 0x09:
    22982302          //FIXME
  • trunk/src/VBox/Devices/Graphics/BIOS/vgarom.asm

    r60441 r67548  
    4848extrn   vbe_biosfn_return_current_mode:near
    4949extrn   vbe_biosfn_display_window_control:near
    50 extrn   vbe_biosfn_set_get_logical_scan_line_length:near
    5150extrn   vbe_biosfn_set_get_display_start:near
    5251extrn   vbe_biosfn_set_get_dac_palette_format:near
     
    167166int10_test_vbe_05:
    168167  cmp   al, 5
    169   jne   int10_test_vbe_06
     168  jne   int10_test_vbe_07
    170169  call  vbe_biosfn_display_window_control
    171   jmp   int10_end
    172 int10_test_vbe_06:
    173   cmp   al, 6
    174   jne   int10_test_vbe_07
    175   call  vbe_biosfn_set_get_logical_scan_line_length
    176170  jmp   int10_end
    177171int10_test_vbe_07:
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