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