14d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// ============================================================================================
24d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima//
34d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima//  Copyright (C) 2002 Jeroen Janssen
44d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima//
54d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima//  This library is free software; you can redistribute it and/or
64d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima//  modify it under the terms of the GNU Lesser General Public
74d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima//  License as published by the Free Software Foundation; either
84d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima//  version 2 of the License, or (at your option) any later version.
94d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima//
104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima//  This library is distributed in the hope that it will be useful,
114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima//  but WITHOUT ANY WARRANTY; without even the implied warranty of
124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima//  Lesser General Public License for more details.
144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima//
154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima//  You should have received a copy of the GNU Lesser General Public
164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima//  License along with this library; if not, write to the Free Software
174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima//
194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// ============================================================================================
204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima//
214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima//  This VBE is part of the VGA Bios specific to the plex86/bochs Emulated VGA card.
224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima//  You can NOT drive any physical vga card with it.
234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima//
244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// ============================================================================================
254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima//
264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima//  This VBE Bios is based on information taken from :
274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima//   - VESA BIOS EXTENSION (VBE) Core Functions Standard Version 3.0 located at www.vesa.org
284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima//
294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// ============================================================================================
304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// defines available
334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// disable VESA/VBE2 check in vbe info
354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima//#define VBE2_NO_VESA_CHECK
364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#include "vbe.h"
394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#include "vbetables.h"
404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// The current OEM Software Revision of this VBE Bios
424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#define VBE_OEM_SOFTWARE_REV 0x0002;
434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaextern char vbebios_copyright;
454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaextern char vbebios_vendor_name;
464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaextern char vbebios_product_name;
474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaextern char vbebios_product_revision;
484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
494d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START
504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// FIXME: 'merge' these (c) etc strings with the vgabios.c strings?
514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima_vbebios_copyright:
524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.ascii       "Bochs/Plex86 VBE(C) 2003 http://savannah.nongnu.org/projects/vgabios/"
534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte        0x00
544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima_vbebios_vendor_name:
564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.ascii       "Bochs/Plex86 Developers"
574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte        0x00
584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima_vbebios_product_name:
604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.ascii       "Bochs/Plex86 VBE Adapter"
614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte        0x00
624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima_vbebios_product_revision:
644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.ascii       "$Id$"
654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte        0x00
664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima_vbebios_info_string:
684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.ascii      "Bochs VBE Display Adapter enabled"
694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte	0x0a,0x0d
704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte	0x0a,0x0d
714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte	0x00
724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima_no_vbebios_info_string:
744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.ascii      "NO Bochs VBE Support available!"
754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte	0x0a,0x0d
764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte	0x0a,0x0d
774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte 0x00
784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#if defined(USE_BX_INFO) || defined(DEBUG)
804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimamsg_vbe_init:
814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.ascii      "VBE Bios $Id$"
824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte	0x0a,0x0d, 0x00
834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif
844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  .align 2
864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavesa_pm_start:
874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  dw vesa_pm_set_window - vesa_pm_start
884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  dw vesa_pm_set_display_start - vesa_pm_start
894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  dw vesa_pm_unimplemented - vesa_pm_start
904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  dw vesa_pm_io_ports_table - vesa_pm_start
914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavesa_pm_io_ports_table:
924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  dw VBE_DISPI_IOPORT_INDEX
934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  dw VBE_DISPI_IOPORT_INDEX + 1
944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  dw VBE_DISPI_IOPORT_DATA
954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  dw VBE_DISPI_IOPORT_DATA + 1
964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  dw 0xffff
974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  dw 0xffff
984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  USE32
1004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavesa_pm_set_window:
1014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  cmp  bx, #0x00
1024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  je  vesa_pm_set_display_window1
1034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, #0x0100
1044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
1054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavesa_pm_set_display_window1:
1064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, dx
1074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push dx
1084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push ax
1094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_INDEX
1104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, # VBE_DISPI_INDEX_BANK
1114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
1124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  ax
1134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_DATA
1144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
1154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  in   ax, dx
1164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  dx
1174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  cmp  dx, ax
1184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  jne  illegal_window
1194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, #0x004f
1204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
1214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaillegal_window:
1224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, #0x014f
1234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
1244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
1254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavesa_pm_set_display_start:
1264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  cmp  bl, #0x80
1274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  je   vesa_pm_set_display_start1
1284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  cmp  bl, #0x00
1294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  je   vesa_pm_set_display_start1
1304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, #0x0100
1314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
1324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavesa_pm_set_display_start1:
1334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima; convert offset to (X, Y) coordinate
1344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima; (would be simpler to change Bochs VBE API...)
1354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push eax
1364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push ecx
1374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push edx
1384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push esi
1394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push edi
1404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  shl edx, #16
1414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  and ecx, #0xffff
1424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  or ecx, edx
1434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  shl ecx, #2
1444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov eax, ecx
1454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
1464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push eax
1474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_INDEX
1484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, # VBE_DISPI_INDEX_VIRT_WIDTH
1494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
1504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_DATA
1514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  in   ax, dx
1524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  movzx ecx, ax
1534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
1544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_INDEX
1554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, # VBE_DISPI_INDEX_BPP
1564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
1574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_DATA
1584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  in   ax, dx
1594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  movzx esi, ax
1604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  eax
1614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
1624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  cmp esi, #4
1634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  jz bpp4_mode
1644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  add esi, #7
1654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  shr esi, #3
1664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  imul ecx, esi
1674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  xor edx, edx
1684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  div ecx
1694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov edi, eax
1704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov eax, edx
1714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  xor edx, edx
1724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  div esi
1734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  jmp set_xy_regs
1744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
1754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabpp4_mode:
1764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  shr ecx, #1
1774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  xor edx, edx
1784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  div ecx
1794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov edi, eax
1804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov eax, edx
1814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  shl eax, #1
1824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
1834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaset_xy_regs:
1844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push dx
1854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push ax
1864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_INDEX
1874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, # VBE_DISPI_INDEX_X_OFFSET
1884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
1894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  ax
1904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_DATA
1914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
1924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  dx
1934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
1944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, di
1954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push dx
1964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push ax
1974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_INDEX
1984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, # VBE_DISPI_INDEX_Y_OFFSET
1994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
2004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  ax
2014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_DATA
2024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
2034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  dx
2044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
2054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop edi
2064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop esi
2074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop edx
2084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop ecx
2094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop eax
2104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, #0x004f
2114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
2124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
2134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavesa_pm_unimplemented:
2144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov ax, #0x014f
2154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
2164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  USE16
2174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavesa_pm_end:
2184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
2194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima; DISPI ioport functions
2204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
2214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimadispi_get_id:
2224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push dx
2234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_INDEX
2244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, # VBE_DISPI_INDEX_ID
2254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
2264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_DATA
2274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  in   ax, dx
2284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  dx
2294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
2304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
2314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimadispi_set_id:
2324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push dx
2334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push ax
2344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_INDEX
2354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, # VBE_DISPI_INDEX_ID
2364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
2374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  ax
2384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_DATA
2394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
2404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  dx
2414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
2424d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END
2434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
2444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void dispi_set_xres(xres)
2454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  Bit16u xres;
2464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{
2474d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START
2484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push bp
2494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  bp, sp
2504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push ax
2514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push dx
2524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
2534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_INDEX
2544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, # VBE_DISPI_INDEX_XRES
2554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
2564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_DATA
2574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, 4[bp] ; xres
2584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
2594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
2604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  dx
2614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  ax
2624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  bp
2634d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END
2644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima}
2654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
2664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void dispi_set_yres(yres)
2674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  Bit16u yres;
2684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{
2694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  outw(VBE_DISPI_IOPORT_INDEX,VBE_DISPI_INDEX_YRES);
2704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  outw(VBE_DISPI_IOPORT_DATA,yres);
2714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima}
2724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
2734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void dispi_set_bpp(bpp)
2744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  Bit16u bpp;
2754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{
2764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  outw(VBE_DISPI_IOPORT_INDEX,VBE_DISPI_INDEX_BPP);
2774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  outw(VBE_DISPI_IOPORT_DATA,bpp);
2784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima}
2794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
2804d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START
2814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima; AL = bits per pixel / AH = bytes per pixel
2824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimadispi_get_bpp:
2834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push dx
2844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_INDEX
2854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, # VBE_DISPI_INDEX_BPP
2864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
2874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_DATA
2884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  in   ax, dx
2894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ah, al
2904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  shr  ah, 3
2914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  test al, #0x07
2924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  jz   get_bpp_noinc
2934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  inc  ah
2944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaget_bpp_noinc:
2954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  dx
2964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
2974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
2984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima; get display capabilities
2994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
3004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima_dispi_get_max_xres:
3014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push dx
3024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push bx
3034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  call dispi_get_enable
3044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  bx, ax
3054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  or   ax, # VBE_DISPI_GETCAPS
3064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  call _dispi_set_enable
3074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_INDEX
3084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, # VBE_DISPI_INDEX_XRES
3094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
3104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_DATA
3114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  in   ax, dx
3124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push ax
3134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, bx
3144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  call _dispi_set_enable
3154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  ax
3164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  bx
3174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  dx
3184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
3194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
3204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima_dispi_get_max_bpp:
3214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push dx
3224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push bx
3234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  call dispi_get_enable
3244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  bx, ax
3254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  or   ax, # VBE_DISPI_GETCAPS
3264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  call _dispi_set_enable
3274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_INDEX
3284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, # VBE_DISPI_INDEX_BPP
3294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
3304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_DATA
3314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  in   ax, dx
3324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push ax
3334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, bx
3344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  call _dispi_set_enable
3354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  ax
3364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  bx
3374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  dx
3384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
3394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
3404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima_dispi_set_enable:
3414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push dx
3424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push ax
3434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_INDEX
3444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, # VBE_DISPI_INDEX_ENABLE
3454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
3464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  ax
3474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_DATA
3484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
3494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  dx
3504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
3514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
3524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimadispi_get_enable:
3534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push dx
3544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_INDEX
3554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, # VBE_DISPI_INDEX_ENABLE
3564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
3574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_DATA
3584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  in   ax, dx
3594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  dx
3604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
3614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
3624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima_dispi_set_bank:
3634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push dx
3644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push ax
3654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_INDEX
3664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, # VBE_DISPI_INDEX_BANK
3674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
3684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  ax
3694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_DATA
3704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
3714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  dx
3724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
3734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
3744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimadispi_get_bank:
3754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push dx
3764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_INDEX
3774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, # VBE_DISPI_INDEX_BANK
3784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
3794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_DATA
3804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  in   ax, dx
3814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  dx
3824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
3834d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END
3844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
3854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void dispi_set_bank_farcall()
3864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{
3874d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START
3884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  cmp bx,#0x0100
3894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  je dispi_set_bank_farcall_get
3904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  or bx,bx
3914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  jnz dispi_set_bank_farcall_error
3924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov ax,dx
3934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push dx
3944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push ax
3954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov ax,# VBE_DISPI_INDEX_BANK
3964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov dx,# VBE_DISPI_IOPORT_INDEX
3974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out dx,ax
3984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop ax
3994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov dx,# VBE_DISPI_IOPORT_DATA
4004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out dx,ax
4014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  in  ax,dx
4024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop dx
4034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  cmp dx,ax
4044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  jne dispi_set_bank_farcall_error
4054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov ax, #0x004f
4064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  retf
4074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimadispi_set_bank_farcall_get:
4084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov ax,# VBE_DISPI_INDEX_BANK
4094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov dx,# VBE_DISPI_IOPORT_INDEX
4104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out dx,ax
4114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov dx,# VBE_DISPI_IOPORT_DATA
4124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  in ax,dx
4134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov dx,ax
4144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  retf
4154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimadispi_set_bank_farcall_error:
4164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov ax,#0x014F
4174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  retf
4184d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END
4194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima}
4204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
4214d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START
4224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimadispi_set_x_offset:
4234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push dx
4244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push ax
4254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_INDEX
4264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, # VBE_DISPI_INDEX_X_OFFSET
4274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
4284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  ax
4294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_DATA
4304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
4314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  dx
4324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
4334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
4344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimadispi_get_x_offset:
4354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push dx
4364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_INDEX
4374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, # VBE_DISPI_INDEX_X_OFFSET
4384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
4394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_DATA
4404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  in   ax, dx
4414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  dx
4424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
4434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
4444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimadispi_set_y_offset:
4454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push dx
4464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push ax
4474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_INDEX
4484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, # VBE_DISPI_INDEX_Y_OFFSET
4494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
4504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  ax
4514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_DATA
4524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
4534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  dx
4544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
4554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
4564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimadispi_get_y_offset:
4574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push dx
4584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_INDEX
4594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, # VBE_DISPI_INDEX_Y_OFFSET
4604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
4614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_DATA
4624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  in   ax, dx
4634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  dx
4644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
4654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
4664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavga_set_virt_width:
4674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push ax
4684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push bx
4694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push dx
4704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  bx, ax
4714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  call dispi_get_bpp
4724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  cmp  al, #0x04
4734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ja   set_width_svga
4744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  shr  bx, #1
4754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaset_width_svga:
4764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  shr  bx, #3
4774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VGAREG_VGA_CRTC_ADDRESS
4784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ah, bl
4794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  al, #0x13
4804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
4814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  dx
4824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  bx
4834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  ax
4844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
4854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
4864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimadispi_set_virt_width:
4874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  call vga_set_virt_width
4884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push dx
4894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push ax
4904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_INDEX
4914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, # VBE_DISPI_INDEX_VIRT_WIDTH
4924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
4934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  ax
4944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_DATA
4954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
4964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  dx
4974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
4984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
4994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimadispi_get_virt_width:
5004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push dx
5014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_INDEX
5024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, # VBE_DISPI_INDEX_VIRT_WIDTH
5034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
5044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_DATA
5054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  in   ax, dx
5064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  dx
5074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
5084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
5094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimadispi_get_virt_height:
5104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push dx
5114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_INDEX
5124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, # VBE_DISPI_INDEX_VIRT_HEIGHT
5134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
5144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_DATA
5154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  in   ax, dx
5164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  dx
5174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
5184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
5194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima_vga_compat_setup:
5204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push ax
5214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push dx
5224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
5234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ; set CRT X resolution
5244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_INDEX
5254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, # VBE_DISPI_INDEX_XRES
5264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
5274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_DATA
5284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  in   ax, dx
5294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push ax
5304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VGAREG_VGA_CRTC_ADDRESS
5314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, #0x0011
5324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
5334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  ax
5344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push ax
5354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  shr  ax, #3
5364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  dec  ax
5374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ah, al
5384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  al, #0x01
5394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
5404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  ax
5414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  call vga_set_virt_width
5424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
5434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ; set CRT Y resolution
5444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_INDEX
5454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, # VBE_DISPI_INDEX_YRES
5464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
5474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_DATA
5484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  in   ax, dx
5494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  dec  ax
5504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push ax
5514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VGAREG_VGA_CRTC_ADDRESS
5524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ah, al
5534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  al, #0x12
5544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
5554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  ax
5564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  al, #0x07
5574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, al
5584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  inc  dx
5594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  in   al, dx
5604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  and  al, #0xbd
5614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  test ah, #0x01
5624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  jz   bit8_clear
5634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  or   al, #0x02
5644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabit8_clear:
5654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  test ah, #0x02
5664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  jz   bit9_clear
5674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  or   al, #0x40
5684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabit9_clear:
5694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, al
5704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
5714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ; other settings
5724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VGAREG_VGA_CRTC_ADDRESS
5734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, #0x0009
5744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
5754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  al, #0x17
5764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, al
5774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VGAREG_VGA_CRTC_DATA
5784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  in   al, dx
5794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  or   al, #0x03
5804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, al
5814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VGAREG_ACTL_RESET
5824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  in   al, dx
5834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VGAREG_ACTL_ADDRESS
5844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  al, #0x10
5854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, al
5864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VGAREG_ACTL_READ_DATA
5874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  in   al, dx
5884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  or   al, #0x01
5894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VGAREG_ACTL_ADDRESS
5904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, al
5914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  al, #0x20
5924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, al
5934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VGAREG_GRDC_ADDRESS
5944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, #0x0506
5954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
5964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VGAREG_SEQU_ADDRESS
5974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, #0x0f02
5984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
5994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
6004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ; settings for >= 8bpp
6014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_INDEX
6024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, # VBE_DISPI_INDEX_BPP
6034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, ax
6044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VBE_DISPI_IOPORT_DATA
6054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  in   ax, dx
6064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  cmp  al, #0x08
6074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  jb   vga_compat_end
6084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VGAREG_VGA_CRTC_ADDRESS
6094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  al, #0x14
6104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, al
6114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VGAREG_VGA_CRTC_DATA
6124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  in   al, dx
6134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  or   al, #0x40
6144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, al
6154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VGAREG_ACTL_RESET
6164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  in   al, dx
6174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VGAREG_ACTL_ADDRESS
6184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  al, #0x10
6194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, al
6204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VGAREG_ACTL_READ_DATA
6214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  in   al, dx
6224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  or   al, #0x40
6234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VGAREG_ACTL_ADDRESS
6244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, al
6254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  al, #0x20
6264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, al
6274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VGAREG_SEQU_ADDRESS
6284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  al, #0x04
6294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, al
6304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VGAREG_SEQU_DATA
6314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  in   al, dx
6324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  or   al, #0x08
6334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, al
6344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VGAREG_GRDC_ADDRESS
6354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  al, #0x05
6364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, al
6374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, # VGAREG_GRDC_DATA
6384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  in   al, dx
6394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  and  al, #0x9f
6404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  or   al, #0x40
6414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  out  dx, al
6424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
6434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavga_compat_end:
6444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  dx
6454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  ax
6464d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END
6474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
6484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
6494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// ModeInfo helper function
6504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic ModeInfoListItem* mode_info_find_mode(mode, using_lfb)
6514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  Bit16u mode; Boolean using_lfb;
6524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{
6534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ModeInfoListItem  *cur_info=&mode_info_list;
6544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
6554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  while (cur_info->mode != VBE_VESA_MODE_END_OF_LIST)
6564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  {
6574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima    if (cur_info->mode == mode)
6584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima    {
6594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima      if (!using_lfb)
6604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima      {
6614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        return cur_info;
6624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima      }
6634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima      else if (cur_info->info.ModeAttributes & VBE_MODE_ATTRIBUTE_LINEAR_FRAME_BUFFER_MODE)
6644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima      {
6654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        return cur_info;
6664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima      }
6674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima      else
6684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima      {
6694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        cur_info++;
6704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima      }
6714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima    }
6724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima    else
6734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima    {
6744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima      cur_info++;
6754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima    }
6764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  }
6774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
6784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  return 0;
6794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima}
6804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
6814d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START
6824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
6834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima; Has VBE display - Returns true if VBE display detected
6844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
6854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima_vbe_has_vbe_display:
6864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push ds
6874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push bx
6884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, # BIOSMEM_SEG
6894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ds, ax
6904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  bx, # BIOSMEM_VBE_FLAG
6914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  al, [bx]
6924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  and  al, #0x01
6934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  xor  ah, ah
6944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  bx
6954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  ds
6964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
6974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
6984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima; VBE Init - Initialise the Vesa Bios Extension Code
6994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima; This function does a sanity check on the host side display code interface.
7004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
7014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavbe_init:
7024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, # VBE_DISPI_ID0
7034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  call dispi_set_id
7044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  call dispi_get_id
7054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  cmp  ax, # VBE_DISPI_ID0
7064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  jne  no_vbe_interface
7074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push ds
7084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push bx
7094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, # BIOSMEM_SEG
7104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ds, ax
7114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  bx, # BIOSMEM_VBE_FLAG
7124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  al, #0x01
7134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  [bx], al
7144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  bx
7154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  ds
7164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, # VBE_DISPI_ID5
7174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  call dispi_set_id
7184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimano_vbe_interface:
7194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#if defined(USE_BX_INFO) || defined(DEBUG)
7204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  bx, #msg_vbe_init
7214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push bx
7224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  call _printf
7234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  inc  sp
7244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  inc  sp
7254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif
7264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
7274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
7284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima; VBE Display Info - Display information on screen about the VBE
7294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
7304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavbe_display_info:
7314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  call _vbe_has_vbe_display
7324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  test ax, ax
7334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  jz   no_vbe_flag
7344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, #0xc000
7354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ds, ax
7364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  si, #_vbebios_info_string
7374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  jmp  _display_string
7384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimano_vbe_flag:
7394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, #0xc000
7404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ds, ax
7414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  si, #_no_vbebios_info_string
7424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  jmp  _display_string
7434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
7444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima; helper function for memory size calculation
7454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
7464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimalmulul:
7474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  and eax, #0x0000FFFF
7484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  shl ebx, #16
7494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  or  eax, ebx
7504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  SEG SS
7514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mul eax, dword ptr [di]
7524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov ebx, eax
7534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  shr ebx, #16
7544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
7554d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END
7564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
7574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima/** Function 00h - Return VBE Controller Information
7584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *
7594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * Input:
7604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              AX      = 4F00h
7614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              ES:DI   = Pointer to buffer in which to place VbeInfoBlock structure
7624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *                        (VbeSignature should be VBE2 when VBE 2.0 information is desired and
7634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *                        the info block is 512 bytes in size)
7644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * Output:
7654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              AX      = VBE Return Status
7664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *
7674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima */
7684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavoid vbe_biosfn_return_controller_information(AX, ES, DI)
7694d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaBit16u *AX;Bit16u ES;Bit16u DI;
7704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{
7714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        Bit16u            ss=get_SS();
7724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        VbeInfoBlock      vbe_info_block;
7734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        Bit16u            status;
7744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        Bit16u            result;
7754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        Bit16u            vbe2_info;
7764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        Bit16u            cur_mode=0;
7774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        Bit16u            cur_ptr=34;
7784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        Bit16u            size_64k;
7794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        ModeInfoListItem  *cur_info=&mode_info_list;
7804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
7814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        status = read_word(ss, AX);
7824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
7834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG
7844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        printf("VBE vbe_biosfn_return_vbe_info ES%x DI%x AX%x\n",ES,DI,status);
7854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif
7864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
7874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        vbe2_info = 0;
7884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef VBE2_NO_VESA_CHECK
7894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#else
7904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        // get vbe_info_block into local variable
7914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        memcpyb(ss, &vbe_info_block, ES, DI, sizeof(vbe_info_block));
7924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
7934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        // check for VBE2 signature
7944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        if (((vbe_info_block.VbeSignature[0] == 'V') &&
7954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima             (vbe_info_block.VbeSignature[1] == 'B') &&
7964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima             (vbe_info_block.VbeSignature[2] == 'E') &&
7974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima             (vbe_info_block.VbeSignature[3] == '2')) ||
7984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
7994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima            ((vbe_info_block.VbeSignature[0] == 'V') &&
8004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima             (vbe_info_block.VbeSignature[1] == 'E') &&
8014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima             (vbe_info_block.VbeSignature[2] == 'S') &&
8024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima             (vbe_info_block.VbeSignature[3] == 'A')) )
8034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        {
8044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                vbe2_info = 1;
8054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG
8064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                printf("VBE correct VESA/VBE2 signature found\n");
8074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif
8084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        }
8094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif
8104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
8114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        // VBE Signature
8124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        vbe_info_block.VbeSignature[0] = 'V';
8134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        vbe_info_block.VbeSignature[1] = 'E';
8144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        vbe_info_block.VbeSignature[2] = 'S';
8154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        vbe_info_block.VbeSignature[3] = 'A';
8164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
8174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        // VBE Version supported
8184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        vbe_info_block.VbeVersion = 0x0200;
8194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
8204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        // OEM String
8214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        vbe_info_block.OemStringPtr_Seg = 0xc000;
8224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        vbe_info_block.OemStringPtr_Off = &vbebios_copyright;
8234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
8244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        // Capabilities
8254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        vbe_info_block.Capabilities[0] = VBE_CAPABILITY_8BIT_DAC;
8264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        vbe_info_block.Capabilities[1] = 0;
8274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        vbe_info_block.Capabilities[2] = 0;
8284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        vbe_info_block.Capabilities[3] = 0;
8294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
8304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        // VBE Video Mode Pointer (dynamicly generated from the mode_info_list)
8314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        vbe_info_block.VideoModePtr_Seg= ES ;
8324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        vbe_info_block.VideoModePtr_Off= DI + 34;
8334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
8344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        // VBE Total Memory (in 64k blocks)
8354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        outw(VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_VIDEO_MEMORY_64K);
8364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        vbe_info_block.TotalMemory = inw(VBE_DISPI_IOPORT_DATA);
8374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
8384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        if (vbe2_info)
8394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        {
8404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                // OEM Stuff
8414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                vbe_info_block.OemSoftwareRev = VBE_OEM_SOFTWARE_REV;
8424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                vbe_info_block.OemVendorNamePtr_Seg = 0xc000;
8434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                vbe_info_block.OemVendorNamePtr_Off = &vbebios_vendor_name;
8444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                vbe_info_block.OemProductNamePtr_Seg = 0xc000;
8454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                vbe_info_block.OemProductNamePtr_Off = &vbebios_product_name;
8464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                vbe_info_block.OemProductRevPtr_Seg = 0xc000;
8474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                vbe_info_block.OemProductRevPtr_Off = &vbebios_product_revision;
8484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
8494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                // copy updates in vbe_info_block back
8504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                memcpyb(ES, DI, ss, &vbe_info_block, sizeof(vbe_info_block));
8514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        }
8524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        else
8534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        {
8544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                // copy updates in vbe_info_block back (VBE 1.x compatibility)
8554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                memcpyb(ES, DI, ss, &vbe_info_block, 256);
8564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        }
8574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
8584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        do
8594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        {
8604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                size_64k = (Bit16u)((Bit32u)cur_info->info.XResolution * cur_info->info.XResolution * cur_info->info.BitsPerPixel) >> 19;
8614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
8624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                if ((cur_info->info.XResolution <= dispi_get_max_xres()) &&
8634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                    (cur_info->info.BitsPerPixel <= dispi_get_max_bpp()) &&
8644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                    (size_64k <= vbe_info_block.TotalMemory)) {
8654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG
8664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                  printf("VBE found mode %x => %x\n", cur_info->mode,cur_mode);
8674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif
8684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                  write_word(ES, DI + cur_ptr, cur_info->mode);
8694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                  cur_mode++;
8704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                  cur_ptr+=2;
8714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                } else {
8724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG
8734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                  printf("VBE mode %x (xres=%x / bpp=%02x) not supported \n", cur_info->mode,cur_info->info.XResolution,cur_info->info.BitsPerPixel);
8744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif
8754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                }
8764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                cur_info++;
8774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        } while (cur_info->mode != VBE_VESA_MODE_END_OF_LIST);
8784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
8794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        // Add vesa mode list terminator
8804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        write_word(ES, DI + cur_ptr, cur_info->mode);
8814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
8824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        result = 0x4f;
8834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
8844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        write_word(ss, AX, result);
8854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima}
8864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
8874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
8884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima/** Function 01h - Return VBE Mode Information
8894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *
8904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * Input:
8914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              AX      = 4F01h
8924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              CX      = Mode Number
8934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              ES:DI   = Pointer to buffer in which to place ModeInfoBlock structure
8944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * Output:
8954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              AX      = VBE Return Status
8964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *
8974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima */
8984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavoid vbe_biosfn_return_mode_information(AX, CX, ES, DI)
8994d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaBit16u *AX;Bit16u CX; Bit16u ES;Bit16u DI;
9004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{
9014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        Bit16u            result=0x0100;
9024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        Bit16u            ss=get_SS();
9034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        ModeInfoBlock     info;
9044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        ModeInfoListItem  *cur_info;
9054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        Boolean           using_lfb;
9064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        Bit16u            lfb_addr;
9074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
9084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG
9094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        printf("VBE vbe_biosfn_return_mode_information ES%x DI%x CX%x\n",ES,DI,CX);
9104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif
9114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
9124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        using_lfb=((CX & VBE_MODE_LINEAR_FRAME_BUFFER) == VBE_MODE_LINEAR_FRAME_BUFFER);
9134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
9144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        CX = (CX & 0x1ff);
9154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
9164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        cur_info = mode_info_find_mode(CX, using_lfb, &cur_info);
9174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
9184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        if (cur_info != 0)
9194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        {
9204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG
9214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                printf("VBE found mode %x\n",CX);
9224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif
9234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                memsetb(ss, &info, 0, sizeof(ModeInfoBlock));
9244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                memcpyb(ss, &info, 0xc000, &(cur_info->info), sizeof(ModeInfoBlockCompact));
9254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                if (using_lfb) {
9264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                  info.NumberOfBanks = 1;
9274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                }
9284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                lfb_addr = pci_get_lfb_addr(0x1234); // experimental vendor
9294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                if (lfb_addr > 0) {
9304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                  info.PhysBasePtr = ((Bit32u)lfb_addr << 16);
9314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                }
9324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                if (info.WinAAttributes & VBE_WINDOW_ATTRIBUTE_RELOCATABLE) {
9334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                  info.WinFuncPtr = 0xC0000000UL;
9344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                  *(Bit16u *)&(info.WinFuncPtr) = (Bit16u)(dispi_set_bank_farcall);
9354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                }
9364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
9374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                result = 0x4f;
9384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        }
9394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        else
9404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        {
9414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG
9424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                printf("VBE *NOT* found mode %x\n",CX);
9434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif
9444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                result = 0x100;
9454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        }
9464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
9474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        if (result == 0x4f)
9484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        {
9494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                // copy updates in mode_info_block back
9504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                memcpyb(ES, DI, ss, &info, sizeof(info));
9514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        }
9524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
9534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        write_word(ss, AX, result);
9544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima}
9554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
9564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima/** Function 02h - Set VBE Mode
9574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *
9584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * Input:
9594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              AX      = 4F02h
9604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              BX      = Desired Mode to set
9614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              ES:DI   = Pointer to CRTCInfoBlock structure
9624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * Output:
9634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              AX      = VBE Return Status
9644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *
9654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima */
9664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavoid vbe_biosfn_set_mode(AX, BX, ES, DI)
9674d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaBit16u *AX;Bit16u BX; Bit16u ES;Bit16u DI;
9684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{
9694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        Bit16u            ss = get_SS();
9704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        Bit16u            result;
9714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        ModeInfoListItem  *cur_info;
9724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        Boolean           using_lfb;
9734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        Bit8u             no_clear;
9744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        Bit8u             lfb_flag;
9754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
9764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        using_lfb=((BX & VBE_MODE_LINEAR_FRAME_BUFFER) == VBE_MODE_LINEAR_FRAME_BUFFER);
9774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        lfb_flag=using_lfb?VBE_DISPI_LFB_ENABLED:0;
9784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        no_clear=((BX & VBE_MODE_PRESERVE_DISPLAY_MEMORY) == VBE_MODE_PRESERVE_DISPLAY_MEMORY)?VBE_DISPI_NOCLEARMEM:0;
9794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
9804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        BX = (BX & 0x1ff);
9814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
9824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        //result=read_word(ss,AX);
9834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
9844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        // check for non vesa mode
9854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        if (BX<VBE_MODE_VESA_DEFINED)
9864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        {
9874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                Bit8u   mode;
9884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
9894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                dispi_set_enable(VBE_DISPI_DISABLED);
9904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                // call the vgabios in order to set the video mode
9914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                // this allows for going back to textmode with a VBE call (some applications expect that to work)
9924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
9934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                mode=(BX & 0xff);
9944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                biosfn_set_video_mode(mode);
9954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                result = 0x4f;
9964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        }
9974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
9984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        cur_info = mode_info_find_mode(BX, using_lfb, &cur_info);
9994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
10004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        if (cur_info != 0)
10014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        {
10024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG
10034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                printf("VBE found mode %x, setting:\n", BX);
10044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                printf("\txres%x yres%x bpp%x\n",
10054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                        cur_info->info.XResolution,
10064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                        cur_info->info.YResolution,
10074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                        cur_info->info.BitsPerPixel);
10084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif
10094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
10104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                // first disable current mode (when switching between vesa modi)
10114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                dispi_set_enable(VBE_DISPI_DISABLED);
10124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
10134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                if (cur_info->info.BitsPerPixel == 4)
10144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                {
10154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                  biosfn_set_video_mode(0x6a);
10164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                }
10174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
10184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                dispi_set_bpp(cur_info->info.BitsPerPixel);
10194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                dispi_set_xres(cur_info->info.XResolution);
10204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                dispi_set_yres(cur_info->info.YResolution);
10214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                dispi_set_bank(0);
10224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                dispi_set_enable(VBE_DISPI_ENABLED | no_clear | lfb_flag);
10234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                vga_compat_setup();
10244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
10254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                write_word(BIOSMEM_SEG,BIOSMEM_VBE_MODE,BX);
10264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                write_byte(BIOSMEM_SEG,BIOSMEM_VIDEO_CTL,(0x60 | no_clear));
10274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
10284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                result = 0x4f;
10294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        }
10304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        else
10314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        {
10324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG
10334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                printf("VBE *NOT* found mode %x\n" , BX);
10344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif
10354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                result = 0x100;
10364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
10374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                // FIXME: redirect non VBE modi to normal VGA bios operation
10384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                //        (switch back to VGA mode
10394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                if (BX == 3)
10404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima                        result = 0x4f;
10414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        }
10424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
10434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        write_word(ss, AX, result);
10444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima}
10454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
10464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima/** Function 03h - Return Current VBE Mode
10474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *
10484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * Input:
10494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              AX      = 4F03h
10504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * Output:
10514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              AX      = VBE Return Status
10524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              BX      = Current VBE Mode
10534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *
10544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima */
10554d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START
10564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavbe_biosfn_return_current_mode:
10574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push ds
10584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, # BIOSMEM_SEG
10594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ds, ax
10604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  call dispi_get_enable
10614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  and  ax, # VBE_DISPI_ENABLED
10624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  jz   no_vbe_mode
10634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  bx, # BIOSMEM_VBE_MODE
10644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, [bx]
10654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  bx, ax
10664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  jnz  vbe_03_ok
10674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimano_vbe_mode:
10684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  bx, # BIOSMEM_CURRENT_MODE
10694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  al, [bx]
10704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  bl, al
10714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  xor  bh, bh
10724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavbe_03_ok:
10734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, #0x004f
10744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  ds
10754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
10764d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END
10774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
10784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
10794d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaBit16u vbe_biosfn_read_video_state_size()
10804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{
10814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima    return 9 * 2;
10824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima}
10834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
10844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavoid vbe_biosfn_save_video_state(ES, BX)
10854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima     Bit16u ES; Bit16u BX;
10864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{
10874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima    Bit16u enable, i;
10884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
10894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima    outw(VBE_DISPI_IOPORT_INDEX,VBE_DISPI_INDEX_ENABLE);
10904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima    enable = inw(VBE_DISPI_IOPORT_DATA);
10914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima    write_word(ES, BX, enable);
10924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima    BX += 2;
10934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima    if (!(enable & VBE_DISPI_ENABLED))
10944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        return;
10954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima    for(i = VBE_DISPI_INDEX_XRES; i <= VBE_DISPI_INDEX_Y_OFFSET; i++) {
10964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        if (i != VBE_DISPI_INDEX_ENABLE) {
10974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima            outw(VBE_DISPI_IOPORT_INDEX, i);
10984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima            write_word(ES, BX, inw(VBE_DISPI_IOPORT_DATA));
10994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima            BX += 2;
11004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        }
11014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima    }
11024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima}
11034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
11044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
11054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavoid vbe_biosfn_restore_video_state(ES, BX)
11064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima     Bit16u ES; Bit16u BX;
11074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{
11084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima    Bit16u enable, i;
11094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
11104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima    enable = read_word(ES, BX);
11114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima    BX += 2;
11124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
11134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima    if (!(enable & VBE_DISPI_ENABLED)) {
11144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        outw(VBE_DISPI_IOPORT_INDEX,VBE_DISPI_INDEX_ENABLE);
11154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        outw(VBE_DISPI_IOPORT_DATA, enable);
11164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima    } else {
11174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        outw(VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_XRES);
11184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        outw(VBE_DISPI_IOPORT_DATA, read_word(ES, BX));
11194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        BX += 2;
11204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        outw(VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_YRES);
11214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        outw(VBE_DISPI_IOPORT_DATA, read_word(ES, BX));
11224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        BX += 2;
11234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        outw(VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_BPP);
11244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        outw(VBE_DISPI_IOPORT_DATA, read_word(ES, BX));
11254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        BX += 2;
11264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        outw(VBE_DISPI_IOPORT_INDEX,VBE_DISPI_INDEX_ENABLE);
11274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        outw(VBE_DISPI_IOPORT_DATA, enable);
11284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
11294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        for(i = VBE_DISPI_INDEX_BANK; i <= VBE_DISPI_INDEX_Y_OFFSET; i++) {
11304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima            outw(VBE_DISPI_IOPORT_INDEX, i);
11314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima            outw(VBE_DISPI_IOPORT_DATA, read_word(ES, BX));
11324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima            BX += 2;
11334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        }
11344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima    }
11354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima}
11364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
11374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima/** Function 04h - Save/Restore State
11384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *
11394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * Input:
11404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              AX      = 4F04h
11414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              DL      = 00h Return Save/Restore State buffer size
11424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *                        01h Save State
11434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *                        02h Restore State
11444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              CX      = Requested states
11454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              ES:BX   = Pointer to buffer (if DL <> 00h)
11464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * Output:
11474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              AX      = VBE Return Status
11484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              BX      = Number of 64-byte blocks to hold the state buffer (if DL=00h)
11494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *
11504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima */
11514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavoid vbe_biosfn_save_restore_state(AX, CX, DX, ES, BX)
11524d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaBit16u *AX; Bit16u CX; Bit16u DX; Bit16u ES; Bit16u *BX;
11534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{
11544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima    Bit16u ss=get_SS();
11554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima    Bit16u result, val;
11564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
11574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima    result = 0x4f;
11584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima    switch(GET_DL()) {
11594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima    case 0x00:
11604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        val = biosfn_read_video_state_size2(CX);
11614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG
11624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        printf("VGA state size=%x\n", val);
11634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif
11644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        if (CX & 8)
11654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima            val += vbe_biosfn_read_video_state_size();
11664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        write_word(ss, BX, val);
11674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        break;
11684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima    case 0x01:
11694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        val = read_word(ss, BX);
11704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        val = biosfn_save_video_state(CX, ES, val);
11714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG
11724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        printf("VGA save_state offset=%x\n", val);
11734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif
11744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        if (CX & 8)
11754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima            vbe_biosfn_save_video_state(ES, val);
11764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        break;
11774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima    case 0x02:
11784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        val = read_word(ss, BX);
11794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        val = biosfn_restore_video_state(CX, ES, val);
11804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG
11814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        printf("VGA restore_state offset=%x\n", val);
11824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif
11834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        if (CX & 8)
11844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima            vbe_biosfn_restore_video_state(ES, val);
11854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        break;
11864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima    default:
11874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        // function failed
11884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        result = 0x100;
11894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima        break;
11904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima    }
11914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima    write_word(ss, AX, result);
11924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima}
11934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
11944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima/** Function 05h - Display Window Control
11954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *
11964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * Input:
11974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              AX      = 4F05h
11984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *     (16-bit) BH      = 00h Set memory window
11994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *                      = 01h Get memory window
12004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              BL      = Window number
12014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *                      = 00h Window A
12024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *                      = 01h Window B
12034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              DX      = Window number in video memory in window
12044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *                        granularity units (Set Memory Window only)
12054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * Note:
12064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              If this function is called while in a linear frame buffer mode,
12074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              this function must fail with completion code AH=03h
12084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *
12094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * Output:
12104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              AX      = VBE Return Status
12114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              DX      = Window number in window granularity units
12124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *                        (Get Memory Window only)
12134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima */
12144d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START
12154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavbe_biosfn_display_window_control:
12164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  cmp  bl, #0x00
12174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  jne  vbe_05_failed
12184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  cmp  bh, #0x01
12194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  je   get_display_window
12204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  jb   set_display_window
12214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, #0x0100
12224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
12234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaset_display_window:
12244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, dx
12254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  call _dispi_set_bank
12264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  call dispi_get_bank
12274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  cmp  ax, dx
12284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  jne  vbe_05_failed
12294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, #0x004f
12304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
12314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaget_display_window:
12324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  call dispi_get_bank
12334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, ax
12344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, #0x004f
12354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
12364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavbe_05_failed:
12374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, #0x014f
12384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
12394d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END
12404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
12414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
12424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima/** Function 06h - Set/Get Logical Scan Line Length
12434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *
12444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * Input:
12454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              AX      = 4F06h
12464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              BL      = 00h Set Scan Line Length in Pixels
12474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *                      = 01h Get Scan Line Length
12484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *                      = 02h Set Scan Line Length in Bytes
12494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *                      = 03h Get Maximum Scan Line Length
12504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              CX      = If BL=00h Desired Width in Pixels
12514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *                        If BL=02h Desired Width in Bytes
12524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *                        (Ignored for Get Functions)
12534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *
12544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * Output:
12554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              AX      = VBE Return Status
12564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              BX      = Bytes Per Scan Line
12574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              CX      = Actual Pixels Per Scan Line
12584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *                        (truncated to nearest complete pixel)
12594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              DX      = Maximum Number of Scan Lines
12604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima */
12614d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START
12624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavbe_biosfn_set_get_logical_scan_line_length:
12634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, cx
12644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  cmp  bl, #0x01
12654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  je   get_logical_scan_line_length
12664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  cmp  bl, #0x02
12674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  je   set_logical_scan_line_bytes
12684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  jb   set_logical_scan_line_pixels
12694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, #0x0100
12704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
12714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaset_logical_scan_line_bytes:
12724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  push ax
12734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  call dispi_get_bpp
12744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  xor  bh, bh
12754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  bl, ah
12764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  or   bl, bl
12774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  jnz  no_4bpp_1
12784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  shl  ax, #3
12794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  bl, #1
12804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimano_4bpp_1:
12814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  xor  dx, dx
12824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  pop  ax
12834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  div  bx
12844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaset_logical_scan_line_pixels:
12854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  call dispi_set_virt_width
12864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaget_logical_scan_line_length:
12874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  call dispi_get_bpp
12884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  xor  bh, bh
12894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  bl, ah
12904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  call dispi_get_virt_width
12914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  cx, ax
12924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  or   bl, bl
12934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  jnz  no_4bpp_2
12944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  shr  ax, #3
12954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  bl, #1
12964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimano_4bpp_2:
12974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mul  bx
12984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  bx, ax
12994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  call dispi_get_virt_height
13004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, ax
13014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, #0x004f
13024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
13034d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END
13044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
13054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
13064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima/** Function 07h - Set/Get Display Start
13074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *
13084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * Input(16-bit):
13094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              AX      = 4F07h
13104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              BH      = 00h Reserved and must be 00h
13114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              BL      = 00h Set Display Start
13124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *                      = 01h Get Display Start
13134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *                      = 02h Schedule Display Start (Alternate)
13144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *                      = 03h Schedule Stereoscopic Display Start
13154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *                      = 04h Get Scheduled Display Start Status
13164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *                      = 05h Enable Stereoscopic Mode
13174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *                      = 06h Disable Stereoscopic Mode
13184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *                      = 80h Set Display Start during Vertical Retrace
13194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *                      = 82h Set Display Start during Vertical Retrace (Alternate)
13204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *                      = 83h Set Stereoscopic Display Start during Vertical Retrace
13214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              ECX     = If BL=02h/82h Display Start Address in bytes
13224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *                        If BL=03h/83h Left Image Start Address in bytes
13234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              EDX     = If BL=03h/83h Right Image Start Address in bytes
13244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              CX      = If BL=00h/80h First Displayed Pixel In Scan Line
13254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              DX      = If BL=00h/80h First Displayed Scan Line
13264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *
13274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * Output:
13284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              AX      = VBE Return Status
13294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              BH      = If BL=01h Reserved and will be 0
13304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              CX      = If BL=01h First Displayed Pixel In Scan Line
13314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *                        If BL=04h 0 if flip has not occurred, not 0 if it has
13324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              DX      = If BL=01h First Displayed Scan Line
13334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *
13344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * Input(32-bit):
13354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              BH      = 00h Reserved and must be 00h
13364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              BL      = 00h Set Display Start
13374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *                      = 80h Set Display Start during Vertical Retrace
13384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              CX      = Bits 0-15 of display start address
13394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              DX      = Bits 16-31 of display start address
13404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              ES      = Selector for memory mapped registers
13414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima */
13424d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START
13434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavbe_biosfn_set_get_display_start:
13444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  cmp  bl, #0x80
13454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  je   set_display_start
13464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  cmp  bl, #0x01
13474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  je   get_display_start
13484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  jb   set_display_start
13494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, #0x0100
13504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
13514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaset_display_start:
13524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, cx
13534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  call dispi_set_x_offset
13544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, dx
13554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  call dispi_set_y_offset
13564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, #0x004f
13574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
13584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaget_display_start:
13594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  call dispi_get_x_offset
13604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  cx, ax
13614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  call dispi_get_y_offset
13624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  dx, ax
13634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  xor  bh, bh
13644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, #0x004f
13654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
13664d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END
13674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
13684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
13694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima/** Function 08h - Set/Get Dac Palette Format
13704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *
13714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * Input:
13724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              AX      = 4F08h
13734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              BL      = 00h set DAC palette width
13744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *                      = 01h get DAC palette width
13754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              BH      = If BL=00h: desired number of bits per primary color
13764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * Output:
13774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              AX      = VBE Return Status
13784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              BH      = current number of bits per primary color (06h = standard VGA)
13794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima */
13804d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START
13814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavbe_biosfn_set_get_dac_palette_format:
13824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  cmp  bl, #0x01
13834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  je   get_dac_palette_format
13844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  jb   set_dac_palette_format
13854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, #0x0100
13864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
13874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaset_dac_palette_format:
13884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  call dispi_get_enable
13894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  cmp  bh, #0x06
13904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  je   set_normal_dac
13914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  cmp  bh, #0x08
13924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  jne  vbe_08_unsupported
13934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  or   ax, # VBE_DISPI_8BIT_DAC
13944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  jnz  set_dac_mode
13954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaset_normal_dac:
13964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  and  ax, #~ VBE_DISPI_8BIT_DAC
13974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaset_dac_mode:
13984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  call _dispi_set_enable
13994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaget_dac_palette_format:
14004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  bh, #0x06
14014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  call dispi_get_enable
14024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  and  ax, # VBE_DISPI_8BIT_DAC
14034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  jz   vbe_08_ok
14044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  bh, #0x08
14054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavbe_08_ok:
14064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, #0x004f
14074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
14084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavbe_08_unsupported:
14094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov  ax, #0x014f
14104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
14114d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END
14124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
14134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
14144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima/** Function 09h - Set/Get Palette Data
14154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *
14164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * Input:
14174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              AX      = 4F09h
14184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * Output:
14194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *              AX      = VBE Return Status
14204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *
14214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * FIXME: incomplete API description, Input & Output
14224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima */
14234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavoid vbe_biosfn_set_get_palette_data(AX)
14244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{
14254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima}
14264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima
14274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima/** Function 0Ah - Return VBE Protected Mode Interface
14284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * Input:    AX   = 4F0Ah   VBE 2.0 Protected Mode Interface
14294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *           BL   = 00h          Return protected mode table
14304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *
14314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *
14324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * Output:   AX   =         Status
14334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *           ES   =         Real Mode Segment of Table
14344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *           DI   =         Offset of Table
14354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *           CX   =         Length of Table including protected mode code
14364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima *                          (for copying purposes)
14374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima */
14384d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START
14394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavbe_biosfn_return_protected_mode_interface:
14404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  test bl, bl
14414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  jnz _fail
14424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov di, #0xc000
14434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov es, di
14444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov di, # vesa_pm_start
14454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov cx, # vesa_pm_end
14464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  sub cx, di
14474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov ax, #0x004f
14484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
14494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima_fail:
14504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  mov ax, #0x014f
14514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima  ret
14524d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END
1453