vgabios.c revision 4d07f569799aaae0d7fccf8e76386d450664987f
14d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// ============================================================================================ 24d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima/* 34d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * vgabios.c 44d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima */ 54d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// ============================================================================================ 64d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// 74d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// Copyright (C) 2001-2008 the LGPL VGABios developers Team 84d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// 94d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// This library is free software; you can redistribute it and/or 104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// modify it under the terms of the GNU Lesser General Public 114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// License as published by the Free Software Foundation; either 124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// version 2 of the License, or (at your option) any later version. 134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// 144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// This library is distributed in the hope that it will be useful, 154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// but WITHOUT ANY WARRANTY; without even the implied warranty of 164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// Lesser General Public License for more details. 184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// 194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// You should have received a copy of the GNU Lesser General Public 204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// License along with this library; if not, write to the Free Software 214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// 234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// ============================================================================================ 244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// 254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// This VGA Bios is specific to the plex86/bochs Emulated VGA card. 264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// You can NOT drive any physical vga card with it. 274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// 284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// ============================================================================================ 294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// 304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// This file contains code ripped from : 314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// - rombios.c of plex86 324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// 334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// This VGA Bios contains fonts from : 344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// - fntcol16.zip (c) by Joseph Gil avalable at : 354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// ftp://ftp.simtel.net/pub/simtelnet/msdos/screen/fntcol16.zip 364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// These fonts are public domain 374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// 384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// This VGA Bios is based on information taken from : 394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// - Kevin Lawton's vga card emulation for bochs/plex86 404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// - Ralf Brown's interrupts list available at http://www.cs.cmu.edu/afs/cs/user/ralf/pub/WWW/files.html 414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// - Finn Thogersons' VGADOC4b available at http://home.worldonline.dk/~finth/ 424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// - Michael Abrash's Graphics Programming Black Book 434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// - Francois Gervais' book "programmation des cartes graphiques cga-ega-vga" edited by sybex 444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// - DOSEMU 1.0.1 source code for several tables values and formulas 454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// 464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// Thanks for patches, comments and ideas to : 474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// - techt@pikeonline.net 484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// 494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// ============================================================================================ 504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#include "vgabios.h" 524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef VBE 544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#include "vbe.h" 554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#define USE_BX_INFO 584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima/* Declares */ 604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic Bit8u read_byte(); 614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic Bit16u read_word(); 624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void write_byte(); 634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void write_word(); 644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic Bit8u inb(); 654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic Bit16u inw(); 664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void outb(); 674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void outw(); 684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic Bit16u get_SS(); 704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// Output 724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void printf(); 734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void unimplemented(); 744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void unknown(); 754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic Bit8u find_vga_entry(); 774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void memsetb(); 794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void memsetw(); 804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void memcpyb(); 814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void memcpyw(); 824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_set_video_mode(); 844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_set_cursor_shape(); 854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_set_cursor_pos(); 864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_get_cursor_pos(); 874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_set_active_page(); 884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_scroll(); 894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_read_char_attr(); 904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_write_char_attr(); 914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_write_char_only(); 924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_write_pixel(); 934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_read_pixel(); 944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_write_teletype(); 954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_perform_gray_scale_summing(); 964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_load_text_user_pat(); 974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_load_text_8_14_pat(); 984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_load_text_8_8_pat(); 994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_load_text_8_16_pat(); 1004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_load_gfx_8_8_chars(); 1014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_load_gfx_user_chars(); 1024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_load_gfx_8_14_chars(); 1034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_load_gfx_8_8_dd_chars(); 1044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_load_gfx_8_16_chars(); 1054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_get_font_info(); 1064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_alternate_prtsc(); 1074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_switch_video_interface(); 1084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_enable_video_refresh_control(); 1094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_write_string(); 1104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_read_state_info(); 1114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_read_video_state_size(); 1124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic Bit16u biosfn_save_video_state(); 1134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic Bit16u biosfn_restore_video_state(); 1144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaextern Bit8u video_save_pointer_table[]; 1154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// This is for compiling with gcc2 and gcc3 1174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#define ASM_START #asm 1184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#define ASM_END #endasm 1194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1204d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 1214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1224d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaMACRO SET_INT_VECTOR 1234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ds 1244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima xor ax, ax 1254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ds, ax 1264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, ?3 1274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ?1*4, ax 1284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, ?2 1294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ?1*4+2, ax 1304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ds 1314d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaMEND 1324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1334d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 1344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1354d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 1364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.text 1374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.rom 1384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.org 0 1394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimause16 386 1414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavgabios_start: 1434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte 0x55, 0xaa /* BIOS signature, required for BIOS extensions */ 1444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte 0x40 /* BIOS extension length in units of 512 bytes */ 1464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavgabios_entry_point: 1494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp vgabios_init_func 1514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef PCIBIOS 1534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.org 0x18 1544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.word vgabios_pci_data 1554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 1564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// Info from Bart Oldeman 1584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.org 0x1e 1594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.ascii "IBM" 1604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte 0x00 1614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavgabios_name: 1634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.ascii "Plex86/Bochs VGABios" 1644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef PCIBIOS 1654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.ascii " (PCI)" 1664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 1674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.ascii " " 1684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte 0x00 1694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavgabios_version: 1714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifndef VGABIOS_VERS 1724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.ascii "current-cvs" 1734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#else 1744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.ascii VGABIOS_VERS 1754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 1764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.ascii " " 1774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavgabios_date: 1794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.ascii VGABIOS_DATE 1804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte 0x0a,0x0d 1814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte 0x00 1824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavgabios_copyright: 1844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.ascii "(C) 2008 the LGPL VGABios developers Team" 1854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte 0x0a,0x0d 1864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte 0x00 1874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavgabios_license: 1894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.ascii "This VGA/VBE Bios is released under the GNU LGPL" 1904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte 0x0a,0x0d 1914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte 0x0a,0x0d 1924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte 0x00 1934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavgabios_website: 1954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.ascii "Please visit :" 1964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte 0x0a,0x0d 1974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;;.ascii " . http://www.plex86.org" 1984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;;.byte 0x0a,0x0d 1994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.ascii " . http://bochs.sourceforge.net" 2004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte 0x0a,0x0d 2014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.ascii " . http://www.nongnu.org/vgabios" 2024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte 0x0a,0x0d 2034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte 0x0a,0x0d 2044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte 0x00 2054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 2064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef PCIBIOS 2074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavgabios_pci_data: 2084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.ascii "PCIR" 2094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef CIRRUS 2104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.word 0x1013 2114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.word 0x00b8 // CLGD5446 2124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#else 2134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#error "Unknown PCI vendor and device id" 2144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 2154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.word 0 // reserved 2164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.word 0x18 // dlen 2174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte 0 // revision 2184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte 0x0 // class,hi: vga display 2194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.word 0x300 // class,lo: vga display 2204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.word 0x40 // bios size 2214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.word 1 // revision 2224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte 0 // intel x86 data 2234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte 0x80 // last image 2244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.word 0 // reserved 2254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 2264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 2274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 2284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;; ============================================================================================ 2294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;; 2304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;; Init Entry point 2314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;; 2324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;; ============================================================================================ 2334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavgabios_init_func: 2344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 2354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;; init vga card 2364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call init_vga_card 2374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 2384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;; init basic bios vars 2394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call init_bios_area 2404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 2414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef VBE 2424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;; init vbe functions 2434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call vbe_init 2444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 2454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 2464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;; set int10 vect 2474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima SET_INT_VECTOR(0x10, #0xC000, #vgabios_int10_handler) 2484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 2494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef CIRRUS 2504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call cirrus_init 2514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 2524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 2534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;; display splash screen 2544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call _display_splash_screen 2554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 2564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;; init video mode and clear the screen 2574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax,#0x0003 2584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima int #0x10 2594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 2604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;; show info 2614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call _display_info 2624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 2634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef VBE 2644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;; show vbe info 2654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call vbe_display_info 2664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 2674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 2684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef CIRRUS 2694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;; show cirrus info 2704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call cirrus_display_info 2714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 2724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 2734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima retf 2744d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 2754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 2764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima/* 2774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * int10 handled here 2784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima */ 2794d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 2804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavgabios_int10_handler: 2814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pushf 2824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 2834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push es 2844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ds 2854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pusha 2864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, #0xc000 2874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ds, bx 2884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call _int10_debugmsg 2894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima popa 2904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ds 2914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop es 2924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 2934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp ah, #0x0f 2944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_test_1A 2954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call biosfn_get_video_mode 2964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp int10_end 2974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_test_1A: 2984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp ah, #0x1a 2994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_test_0B 3004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call biosfn_group_1A 3014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp int10_end 3024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_test_0B: 3034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp ah, #0x0b 3044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_test_1103 3054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call biosfn_group_0B 3064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp int10_end 3074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_test_1103: 3084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp ax, #0x1103 3094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_test_12 3104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call biosfn_set_text_block_specifier 3114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp int10_end 3124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_test_12: 3134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp ah, #0x12 3144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_test_101B 3154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp bl, #0x10 3164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_test_BL30 3174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call biosfn_get_ega_info 3184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp int10_end 3194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_test_BL30: 3204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp bl, #0x30 3214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_test_BL31 3224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call biosfn_select_vert_res 3234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp int10_end 3244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_test_BL31: 3254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp bl, #0x31 3264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_test_BL32 3274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call biosfn_enable_default_palette_loading 3284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp int10_end 3294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_test_BL32: 3304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp bl, #0x32 3314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_test_BL33 3324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call biosfn_enable_video_addressing 3334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp int10_end 3344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_test_BL33: 3354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp bl, #0x33 3364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_test_BL34 3374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call biosfn_enable_grayscale_summing 3384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp int10_end 3394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_test_BL34: 3404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp bl, #0x34 3414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_normal 3424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call biosfn_enable_cursor_emulation 3434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp int10_end 3444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_test_101B: 3454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp ax, #0x101b 3464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima je int10_normal 3474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp ah, #0x10 3484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifndef VBE 3494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_normal 3504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#else 3514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_test_4F 3524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 3534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call biosfn_group_10 3544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp int10_end 3554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef VBE 3564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_test_4F: 3574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp ah, #0x4f 3584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_normal 3594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x03 3604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_test_vbe_05 3614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call vbe_biosfn_return_current_mode 3624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp int10_end 3634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_test_vbe_05: 3644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x05 3654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_test_vbe_06 3664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call vbe_biosfn_display_window_control 3674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp int10_end 3684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_test_vbe_06: 3694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x06 3704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_test_vbe_07 3714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call vbe_biosfn_set_get_logical_scan_line_length 3724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp int10_end 3734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_test_vbe_07: 3744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x07 3754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_test_vbe_08 3764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call vbe_biosfn_set_get_display_start 3774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp int10_end 3784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_test_vbe_08: 3794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x08 3804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_test_vbe_0A 3814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call vbe_biosfn_set_get_dac_palette_format 3824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp int10_end 3834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_test_vbe_0A: 3844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x0A 3854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_normal 3864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call vbe_biosfn_return_protected_mode_interface 3874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp int10_end 3884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 3894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 3904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_normal: 3914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push es 3924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ds 3934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pusha 3944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 3954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;; We have to set ds to access the right data segment 3964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, #0xc000 3974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ds, bx 3984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call _int10_func 3994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 4004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima popa 4014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ds 4024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop es 4034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_end: 4044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima popf 4054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima iret 4064d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 4074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 4084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#include "vgatables.h" 4094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#include "vgafonts.h" 4104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 4114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima/* 4124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * Boot time harware inits 4134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima */ 4144d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 4154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimainit_vga_card: 4164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;; switch to color mode and enable CPU access 480 lines 4174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, #0x3C2 4184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #0xC3 4194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb dx,al 4204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 4214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;; more than 64k 3C4/04 4224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, #0x3C4 4234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #0x04 4244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb dx,al 4254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, #0x3C5 4264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #0x02 4274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb dx,al 4284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 4294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#if defined(USE_BX_INFO) || defined(DEBUG) 4304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, #msg_vga_init 4314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bx 4324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call _printf 4334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima inc sp 4344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima inc sp 4354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 4364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 4374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 4384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#if defined(USE_BX_INFO) || defined(DEBUG) 4394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimamsg_vga_init: 4404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.ascii "VGABios $Id$" 4414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte 0x0d,0x0a,0x00 4424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 4434d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 4444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 4454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 4464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima/* 4474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * Boot time bios area inits 4484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima */ 4494d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 4504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimainit_bios_area: 4514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ds 4524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, # BIOSMEM_SEG 4534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ds, ax 4544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 4554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;; init detected hardware BIOS Area 4564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, # BIOSMEM_INITIAL_MODE 4574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, [bx] 4584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima and ax, #0xffcf 4594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;; set 80x25 color (not clear from RBIL but usual) 4604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima or ax, #0x0020 4614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov [bx], ax 4624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 4634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;; Just for the first int10 find its children 4644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 4654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;; the default char height 4664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, # BIOSMEM_CHAR_HEIGHT 4674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #0x10 4684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov [bx], al 4694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 4704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;; Clear the screen 4714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, # BIOSMEM_VIDEO_CTL 4724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #0x60 4734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov [bx], al 4744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 4754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;; Set the basic screen we have 4764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, # BIOSMEM_SWITCHES 4774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #0xf9 4784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov [bx], al 4794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 4804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;; Set the basic modeset options 4814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, # BIOSMEM_MODESET_CTL 4824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #0x51 4834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov [bx], al 4844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 4854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;; Set the default MSR 4864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, # BIOSMEM_CURRENT_MSR 4874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #0x09 4884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov [bx], al 4894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 4904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ds 4914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 4924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 4934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima_video_save_pointer_table: 4944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima .word _video_param_table 4954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima .word 0xc000 4964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 4974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima .word 0 /* XXX: fill it */ 4984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima .word 0 4994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 5004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima .word 0 /* XXX: fill it */ 5014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima .word 0 5024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 5034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima .word 0 /* XXX: fill it */ 5044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima .word 0 5054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 5064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima .word 0 /* XXX: fill it */ 5074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima .word 0 5084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 5094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima .word 0 /* XXX: fill it */ 5104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima .word 0 5114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 5124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima .word 0 /* XXX: fill it */ 5134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima .word 0 5144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 5154d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 5164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 5174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 5184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima/* 5194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * Boot time Splash screen 5204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima */ 5214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void display_splash_screen() 5224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 5234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 5244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 5254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 5264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima/* 5274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * Tell who we are 5284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima */ 5294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 5304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void display_info() 5314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 5324d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 5334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax,#0xc000 5344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ds,ax 5354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov si,#vgabios_name 5364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call _display_string 5374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov si,#vgabios_version 5384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call _display_string 5394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 5404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ;;mov si,#vgabios_copyright 5414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ;;call _display_string 5424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ;;mov si,#crlf 5434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ;;call _display_string 5444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 5454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov si,#vgabios_license 5464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call _display_string 5474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov si,#vgabios_website 5484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call _display_string 5494d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 5504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 5514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 5524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void display_string() 5534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 5544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Get length of string 5554d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 5564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax,ds 5574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov es,ax 5584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov di,si 5594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima xor cx,cx 5604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima not cx 5614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima xor al,al 5624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cld 5634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima repne 5644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima scasb 5654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima not cx 5664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima dec cx 5674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push cx 5684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 5694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax,#0x0300 5704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx,#0x0000 5714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima int #0x10 5724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 5734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop cx 5744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax,#0x1301 5754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx,#0x000b 5764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bp,si 5774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima int #0x10 5784d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 5794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 5804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 5814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 5824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 5834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void int10_debugmsg(DI, SI, BP, SP, BX, DX, CX, AX, DS, ES, FLAGS) 5844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u DI, SI, BP, SP, BX, DX, CX, AX, ES, DS, FLAGS; 5854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 5864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // 0E is write char... 5874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(GET_AH()!=0x0E) 5884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima printf("vgabios call ah%02x al%02x bx%04x cx%04x dx%04x\n",GET_AH(),GET_AL(),BX,CX,DX); 5894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 5904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 5914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 5924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 5934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima/* 5944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * int10 main dispatcher 5954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima */ 5964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void int10_func(DI, SI, BP, SP, BX, DX, CX, AX, DS, ES, FLAGS) 5974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u DI, SI, BP, SP, BX, DX, CX, AX, ES, DS, FLAGS; 5984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 5994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 6004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // BIOS functions 6014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima switch(GET_AH()) 6024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 6034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x00: 6044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_set_video_mode(GET_AL()); 6054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima switch(GET_AL()&0x7F) 6064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima {case 6: 6074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima SET_AL(0x3F); 6084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 6094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0: 6104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 1: 6114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 2: 6124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 3: 6134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 4: 6144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 5: 6154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 7: 6164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima SET_AL(0x30); 6174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 6184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima default: 6194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima SET_AL(0x20); 6204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 6214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 6224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x01: 6234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_set_cursor_shape(GET_CH(),GET_CL()); 6244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 6254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x02: 6264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_set_cursor_pos(GET_BH(),DX); 6274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 6284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x03: 6294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_get_cursor_pos(GET_BH(),&CX,&DX); 6304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 6314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x04: 6324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Read light pen pos (unimplemented) 6334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 6344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima unimplemented(); 6354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 6364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima AX=0x00; 6374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima BX=0x00; 6384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima CX=0x00; 6394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima DX=0x00; 6404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 6414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x05: 6424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_set_active_page(GET_AL()); 6434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 6444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x06: 6454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_scroll(GET_AL(),GET_BH(),GET_CH(),GET_CL(),GET_DH(),GET_DL(),0xFF,SCROLL_UP); 6464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 6474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x07: 6484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_scroll(GET_AL(),GET_BH(),GET_CH(),GET_CL(),GET_DH(),GET_DL(),0xFF,SCROLL_DOWN); 6494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 6504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x08: 6514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_read_char_attr(GET_BH(),&AX); 6524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 6534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x09: 6544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_write_char_attr(GET_AL(),GET_BH(),GET_BL(),CX); 6554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 6564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x0A: 6574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_write_char_only(GET_AL(),GET_BH(),GET_BL(),CX); 6584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 6594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x0C: 6604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_write_pixel(GET_BH(),GET_AL(),CX,DX); 6614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 6624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x0D: 6634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_read_pixel(GET_BH(),CX,DX,&AX); 6644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 6654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x0E: 6664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Ralf Brown Interrupt list is WRONG on bh(page) 6674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // We do output only on the current page ! 6684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_write_teletype(GET_AL(),0xff,GET_BL(),NO_ATTR); 6694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 6704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x10: 6714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // All other functions of group AH=0x10 rewritten in assembler 6724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_perform_gray_scale_summing(BX,CX); 6734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 6744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x11: 6754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima switch(GET_AL()) 6764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 6774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x00: 6784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x10: 6794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_load_text_user_pat(GET_AL(),ES,BP,CX,DX,GET_BL(),GET_BH()); 6804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 6814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x01: 6824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x11: 6834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_load_text_8_14_pat(GET_AL(),GET_BL()); 6844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 6854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x02: 6864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x12: 6874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_load_text_8_8_pat(GET_AL(),GET_BL()); 6884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 6894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x04: 6904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x14: 6914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_load_text_8_16_pat(GET_AL(),GET_BL()); 6924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 6934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x20: 6944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_load_gfx_8_8_chars(ES,BP); 6954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 6964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x21: 6974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_load_gfx_user_chars(ES,BP,CX,GET_BL(),GET_DL()); 6984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 6994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x22: 7004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_load_gfx_8_14_chars(GET_BL()); 7014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 7024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x23: 7034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_load_gfx_8_8_dd_chars(GET_BL()); 7044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 7054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x24: 7064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_load_gfx_8_16_chars(GET_BL()); 7074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 7084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x30: 7094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_get_font_info(GET_BH(),&ES,&BP,&CX,&DX); 7104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 7114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 7124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima default: 7134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima unknown(); 7144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 7154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 7164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 7174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 7184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x12: 7194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima switch(GET_BL()) 7204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 7214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x20: 7224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_alternate_prtsc(); 7234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 7244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x35: 7254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_switch_video_interface(GET_AL(),ES,DX); 7264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima SET_AL(0x12); 7274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 7284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x36: 7294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_enable_video_refresh_control(GET_AL()); 7304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima SET_AL(0x12); 7314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 7324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 7334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima default: 7344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima unknown(); 7354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 7364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 7374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 7384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x13: 7394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_write_string(GET_AL(),GET_BH(),GET_BL(),CX,GET_DH(),GET_DL(),ES,BP); 7404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 7414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x1B: 7424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_read_state_info(BX,ES,DI); 7434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima SET_AL(0x1B); 7444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 7454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x1C: 7464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima switch(GET_AL()) 7474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 7484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x00: 7494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_read_video_state_size(CX,&BX); 7504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 7514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x01: 7524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_save_video_state(CX,ES,BX); 7534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 7544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x02: 7554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_restore_video_state(CX,ES,BX); 7564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 7574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 7584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima default: 7594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima unknown(); 7604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 7614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 7624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima SET_AL(0x1C); 7634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 7644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 7654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef VBE 7664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x4f: 7674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (vbe_has_vbe_display()) { 7684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima switch(GET_AL()) 7694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 7704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x00: 7714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima vbe_biosfn_return_controller_information(&AX,ES,DI); 7724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 7734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x01: 7744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima vbe_biosfn_return_mode_information(&AX,CX,ES,DI); 7754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 7764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x02: 7774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima vbe_biosfn_set_mode(&AX,BX,ES,DI); 7784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 7794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x04: 7804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima vbe_biosfn_save_restore_state(&AX, CX, DX, ES, &BX); 7814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 7824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x09: 7834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima //FIXME 7844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 7854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima unimplemented(); 7864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 7874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // function failed 7884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima AX=0x100; 7894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 7904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x0A: 7914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima //FIXME 7924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 7934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima unimplemented(); 7944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 7954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // function failed 7964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima AX=0x100; 7974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 7984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima default: 7994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 8004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima unknown(); 8014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 8024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // function failed 8034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima AX=0x100; 8044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 8054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 8064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else { 8074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // No VBE display 8084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima AX=0x0100; 8094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 8104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 8114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 8124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 8134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 8144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima default: 8154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima unknown(); 8164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 8174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 8184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 8194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 8204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// ============================================================================================ 8214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// 8224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// BIOS functions 8234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// 8244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// ============================================================================================ 8254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 8264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_set_video_mode(mode) Bit8u mode; 8274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{// mode: Bit 7 is 1 if no clear screen 8284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 8294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Should we clear the screen ? 8304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit8u noclearmem=mode&0x80; 8314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit8u line,mmask,*palette,vpti; 8324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u i,twidth,theightm1,cheight; 8334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit8u modeset_ctl,video_ctl,vga_switches; 8344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u crtc_addr; 8354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 8364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef VBE 8374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (vbe_has_vbe_display()) { 8384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima dispi_set_enable(VBE_DISPI_DISABLED); 8394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 8404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif // def VBE 8414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 8424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // The real mode 8434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mode=mode&0x7f; 8444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 8454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // find the entry in the video modes 8464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima line=find_vga_entry(mode); 8474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 8484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 8494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima printf("mode search %02x found line %02x\n",mode,line); 8504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 8514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 8524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(line==0xFF) 8534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima return; 8544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 8554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima vpti=line_to_vpti[line]; 8564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima twidth=video_param_table[vpti].twidth; 8574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima theightm1=video_param_table[vpti].theightm1; 8584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cheight=video_param_table[vpti].cheight; 8594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 8604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Read the bios vga control 8614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima video_ctl=read_byte(BIOSMEM_SEG,BIOSMEM_VIDEO_CTL); 8624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 8634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Read the bios vga switches 8644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima vga_switches=read_byte(BIOSMEM_SEG,BIOSMEM_SWITCHES); 8654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 8664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Read the bios mode set control 8674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima modeset_ctl=read_byte(BIOSMEM_SEG,BIOSMEM_MODESET_CTL); 8684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 8694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Then we know the number of lines 8704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// FIXME 8714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 8724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // if palette loading (bit 3 of modeset ctl = 0) 8734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if((modeset_ctl&0x08)==0) 8744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima {// Set the PEL mask 8754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_PEL_MASK,vga_modes[line].pelmask); 8764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 8774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Set the whole dac always, from 0 8784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_DAC_WRITE_ADDRESS,0x00); 8794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 8804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // From which palette 8814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima switch(vga_modes[line].dacmodel) 8824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima {case 0: 8834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima palette=&palette0; 8844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 8854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 1: 8864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima palette=&palette1; 8874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 8884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 2: 8894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima palette=&palette2; 8904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 8914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 3: 8924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima palette=&palette3; 8934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 8944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 8954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Always 256*3 values 8964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(i=0;i<0x0100;i++) 8974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima {if(i<=dac_regs[vga_modes[line].dacmodel]) 8984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima {outb(VGAREG_DAC_DATA,palette[(i*3)+0]); 8994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_DAC_DATA,palette[(i*3)+1]); 9004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_DAC_DATA,palette[(i*3)+2]); 9014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 9024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 9034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima {outb(VGAREG_DAC_DATA,0); 9044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_DAC_DATA,0); 9054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_DAC_DATA,0); 9064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 9074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 9084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if((modeset_ctl&0x02)==0x02) 9094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 9104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_perform_gray_scale_summing(0x00, 0x100); 9114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 9124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 9134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 9144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Reset Attribute Ctl flip-flop 9154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima inb(VGAREG_ACTL_RESET); 9164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 9174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Set Attribute Ctl 9184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(i=0;i<=0x13;i++) 9194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima {outb(VGAREG_ACTL_ADDRESS,i); 9204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_ACTL_WRITE_DATA,video_param_table[vpti].actl_regs[i]); 9214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 9224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_ACTL_ADDRESS,0x14); 9234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_ACTL_WRITE_DATA,0x00); 9244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 9254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Set Sequencer Ctl 9264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_SEQU_ADDRESS,0); 9274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_SEQU_DATA,0x03); 9284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(i=1;i<=4;i++) 9294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima {outb(VGAREG_SEQU_ADDRESS,i); 9304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_SEQU_DATA,video_param_table[vpti].sequ_regs[i - 1]); 9314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 9324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 9334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Set Grafx Ctl 9344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(i=0;i<=8;i++) 9354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima {outb(VGAREG_GRDC_ADDRESS,i); 9364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_GRDC_DATA,video_param_table[vpti].grdc_regs[i]); 9374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 9384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 9394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Set CRTC address VGA or MDA 9404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima crtc_addr=vga_modes[line].memmodel==MTEXT?VGAREG_MDA_CRTC_ADDRESS:VGAREG_VGA_CRTC_ADDRESS; 9414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 9424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Disable CRTC write protection 9434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outw(crtc_addr,0x0011); 9444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Set CRTC regs 9454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(i=0;i<=0x18;i++) 9464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima {outb(crtc_addr,i); 9474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(crtc_addr+1,video_param_table[vpti].crtc_regs[i]); 9484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 9494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 9504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Set the misc register 9514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_WRITE_MISC_OUTPUT,video_param_table[vpti].miscreg); 9524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 9534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Enable video 9544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_ACTL_ADDRESS,0x20); 9554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima inb(VGAREG_ACTL_RESET); 9564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 9574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(noclearmem==0x00) 9584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 9594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(vga_modes[line].class==TEXT) 9604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 9614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima memsetw(vga_modes[line].sstart,0,0x0720,0x4000); // 32k 9624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 9634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 9644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 9654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(mode<0x0d) 9664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 9674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima memsetw(vga_modes[line].sstart,0,0x0000,0x4000); // 32k 9684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 9694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 9704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 9714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb( VGAREG_SEQU_ADDRESS, 0x02 ); 9724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mmask = inb( VGAREG_SEQU_DATA ); 9734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb( VGAREG_SEQU_DATA, 0x0f ); // all planes 9744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima memsetw(vga_modes[line].sstart,0,0x0000,0x8000); // 64k 9754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb( VGAREG_SEQU_DATA, mmask ); 9764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 9774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 9784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 9794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 9804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Set the BIOS mem 9814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_MODE,mode); 9824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(BIOSMEM_SEG,BIOSMEM_NB_COLS,twidth); 9834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(BIOSMEM_SEG,BIOSMEM_PAGE_SIZE,*(Bit16u *)&video_param_table[vpti].slength_l); 9844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(BIOSMEM_SEG,BIOSMEM_CRTC_ADDRESS,crtc_addr); 9854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS,theightm1); 9864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(BIOSMEM_SEG,BIOSMEM_CHAR_HEIGHT,cheight); 9874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(BIOSMEM_SEG,BIOSMEM_VIDEO_CTL,(0x60|noclearmem)); 9884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(BIOSMEM_SEG,BIOSMEM_SWITCHES,0xF9); 9894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(BIOSMEM_SEG,BIOSMEM_MODESET_CTL,read_byte(BIOSMEM_SEG,BIOSMEM_MODESET_CTL)&0x7f); 9904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 9914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // FIXME We nearly have the good tables. to be reworked 9924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(BIOSMEM_SEG,BIOSMEM_DCC_INDEX,0x08); // 8 is VGA should be ok for now 9934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(BIOSMEM_SEG,BIOSMEM_VS_POINTER, video_save_pointer_table); 9944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(BIOSMEM_SEG,BIOSMEM_VS_POINTER+2, 0xc000); 9954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 9964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // FIXME 9974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_MSR,0x00); // Unavailable on vanilla vga, but... 9984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_PAL,0x00); // Unavailable on vanilla vga, but... 9994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 10004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Set cursor shape 10014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(vga_modes[line].class==TEXT) 10024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 10034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_set_cursor_shape(0x06,0x07); 10044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 10054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 10064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Set cursor pos for page 0..7 10074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(i=0;i<8;i++) 10084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_set_cursor_pos(i,0x0000); 10094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 10104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Set active page 0 10114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_set_active_page(0x00); 10124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 10134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Write the fonts in memory 10144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(vga_modes[line].class==TEXT) 10154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 10164d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 10174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ;; copy and activate 8x16 font 10184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, #0x1104 10194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bl, #0x00 10204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima int #0x10 10214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, #0x1103 10224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bl, #0x00 10234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima int #0x10 10244d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 10254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 10264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 10274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Set the ints 0x1F and 0x43 10284d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 10294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima SET_INT_VECTOR(0x1f, #0xC000, #_vgafont8+128*8) 10304d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 10314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 10324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima switch(cheight) 10334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima {case 8: 10344d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 10354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima SET_INT_VECTOR(0x43, #0xC000, #_vgafont8) 10364d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 10374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 10384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 14: 10394d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 10404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima SET_INT_VECTOR(0x43, #0xC000, #_vgafont14) 10414d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 10424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 10434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 16: 10444d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 10454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima SET_INT_VECTOR(0x43, #0xC000, #_vgafont16) 10464d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 10474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 10484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 10494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 10504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 10514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 10524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_set_cursor_shape (CH,CL) 10534d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaBit8u CH;Bit8u CL; 10544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{Bit16u cheight,curs,crtc_addr; 10554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit8u modeset_ctl; 10564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 10574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima CH&=0x3f; 10584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima CL&=0x1f; 10594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 10604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima curs=(CH<<8)+CL; 10614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(BIOSMEM_SEG,BIOSMEM_CURSOR_TYPE,curs); 10624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 10634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima modeset_ctl=read_byte(BIOSMEM_SEG,BIOSMEM_MODESET_CTL); 10644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cheight = read_word(BIOSMEM_SEG,BIOSMEM_CHAR_HEIGHT); 10654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if((modeset_ctl&0x01) && (cheight>8) && (CL<8) && (CH<0x20)) 10664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 10674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(CL!=(CH+1)) 10684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 10694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima CH = ((CH+1) * cheight / 8) -1; 10704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 10714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 10724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 10734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima CH = ((CL+1) * cheight / 8) - 2; 10744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 10754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima CL = ((CL+1) * cheight / 8) - 1; 10764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 10774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 10784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // CTRC regs 0x0a and 0x0b 10794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima crtc_addr=read_word(BIOSMEM_SEG,BIOSMEM_CRTC_ADDRESS); 10804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(crtc_addr,0x0a); 10814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(crtc_addr+1,CH); 10824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(crtc_addr,0x0b); 10834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(crtc_addr+1,CL); 10844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 10854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 10864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 10874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_set_cursor_pos (page, cursor) 10884d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaBit8u page;Bit16u cursor; 10894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 10904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit8u xcurs,ycurs,current; 10914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u nbcols,nbrows,address,crtc_addr; 10924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 10934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Should not happen... 10944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(page>7)return; 10954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 10964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Bios cursor pos 10974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(BIOSMEM_SEG, BIOSMEM_CURSOR_POS+2*page, cursor); 10984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 10994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Set the hardware cursor 11004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima current=read_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_PAGE); 11014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(page==current) 11024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 11034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Get the dimensions 11044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima nbcols=read_word(BIOSMEM_SEG,BIOSMEM_NB_COLS); 11054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima nbrows=read_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS)+1; 11064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 11074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima xcurs=cursor&0x00ff;ycurs=(cursor&0xff00)>>8; 11084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 11094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Calculate the address knowing nbcols nbrows and page num 11104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima address=SCREEN_IO_START(nbcols,nbrows,page)+xcurs+ycurs*nbcols; 11114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 11124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // CRTC regs 0x0e and 0x0f 11134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima crtc_addr=read_word(BIOSMEM_SEG,BIOSMEM_CRTC_ADDRESS); 11144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(crtc_addr,0x0e); 11154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(crtc_addr+1,(address&0xff00)>>8); 11164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(crtc_addr,0x0f); 11174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(crtc_addr+1,address&0x00ff); 11184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 11194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 11204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 11214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 11224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_get_cursor_pos (page,shape, pos) 11234d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaBit8u page;Bit16u *shape;Bit16u *pos; 11244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 11254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u ss=get_SS(); 11264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 11274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Default 11284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ss, shape, 0); 11294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ss, pos, 0); 11304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 11314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(page>7)return; 11324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // FIXME should handle VGA 14/16 lines 11334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ss,shape,read_word(BIOSMEM_SEG,BIOSMEM_CURSOR_TYPE)); 11344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ss,pos,read_word(BIOSMEM_SEG,BIOSMEM_CURSOR_POS+page*2)); 11354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 11364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 11374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 11384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_set_active_page (page) 11394d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaBit8u page; 11404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 11414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u cursor,dummy,crtc_addr; 11424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u nbcols,nbrows,address; 11434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit8u mode,line; 11444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 11454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(page>7)return; 11464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 11474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Get the mode 11484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mode=read_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_MODE); 11494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima line=find_vga_entry(mode); 11504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(line==0xFF)return; 11514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 11524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Get pos curs pos for the right page 11534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_get_cursor_pos(page,&dummy,&cursor); 11544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 11554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(vga_modes[line].class==TEXT) 11564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 11574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Get the dimensions 11584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima nbcols=read_word(BIOSMEM_SEG,BIOSMEM_NB_COLS); 11594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima nbrows=read_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS)+1; 11604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 11614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Calculate the address knowing nbcols nbrows and page num 11624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima address=SCREEN_MEM_START(nbcols,nbrows,page); 11634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(BIOSMEM_SEG,BIOSMEM_CURRENT_START,address); 11644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 11654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Start address 11664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima address=SCREEN_IO_START(nbcols,nbrows,page); 11674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 11684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 11694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 11704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima address = page * (*(Bit16u *)&video_param_table[line_to_vpti[line]].slength_l); 11714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 11724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 11734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // CRTC regs 0x0c and 0x0d 11744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima crtc_addr=read_word(BIOSMEM_SEG,BIOSMEM_CRTC_ADDRESS); 11754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(crtc_addr,0x0c); 11764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(crtc_addr+1,(address&0xff00)>>8); 11774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(crtc_addr,0x0d); 11784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(crtc_addr+1,address&0x00ff); 11794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 11804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // And change the BIOS page 11814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_PAGE,page); 11824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 11834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 11844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima printf("Set active page %02x address %04x\n",page,address); 11854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 11864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 11874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Display the cursor, now the page is active 11884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_set_cursor_pos(page,cursor); 11894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 11904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 11914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 11924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void vgamem_copy_pl4(xstart,ysrc,ydest,cols,nbcols,cheight) 11934d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaBit8u xstart;Bit8u ysrc;Bit8u ydest;Bit8u cols;Bit8u nbcols;Bit8u cheight; 11944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 11954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u src,dest; 11964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit8u i; 11974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 11984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima src=ysrc*cheight*nbcols+xstart; 11994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima dest=ydest*cheight*nbcols+xstart; 12004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outw(VGAREG_GRDC_ADDRESS, 0x0105); 12014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(i=0;i<cheight;i++) 12024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 12034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima memcpyb(0xa000,dest+i*nbcols,0xa000,src+i*nbcols,cols); 12044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 12054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outw(VGAREG_GRDC_ADDRESS, 0x0005); 12064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 12074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 12084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 12094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void vgamem_fill_pl4(xstart,ystart,cols,nbcols,cheight,attr) 12104d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaBit8u xstart;Bit8u ystart;Bit8u cols;Bit8u nbcols;Bit8u cheight;Bit8u attr; 12114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 12124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u dest; 12134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit8u i; 12144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 12154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima dest=ystart*cheight*nbcols+xstart; 12164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outw(VGAREG_GRDC_ADDRESS, 0x0205); 12174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(i=0;i<cheight;i++) 12184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 12194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima memsetb(0xa000,dest+i*nbcols,attr,cols); 12204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 12214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outw(VGAREG_GRDC_ADDRESS, 0x0005); 12224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 12234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 12244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 12254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void vgamem_copy_cga(xstart,ysrc,ydest,cols,nbcols,cheight) 12264d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaBit8u xstart;Bit8u ysrc;Bit8u ydest;Bit8u cols;Bit8u nbcols;Bit8u cheight; 12274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 12284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u src,dest; 12294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit8u i; 12304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 12314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima src=((ysrc*cheight*nbcols)>>1)+xstart; 12324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima dest=((ydest*cheight*nbcols)>>1)+xstart; 12334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(i=0;i<cheight;i++) 12344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 12354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (i & 1) 12364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima memcpyb(0xb800,0x2000+dest+(i>>1)*nbcols,0xb800,0x2000+src+(i>>1)*nbcols,cols); 12374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 12384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima memcpyb(0xb800,dest+(i>>1)*nbcols,0xb800,src+(i>>1)*nbcols,cols); 12394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 12404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 12414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 12424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 12434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void vgamem_fill_cga(xstart,ystart,cols,nbcols,cheight,attr) 12444d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaBit8u xstart;Bit8u ystart;Bit8u cols;Bit8u nbcols;Bit8u cheight;Bit8u attr; 12454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 12464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u dest; 12474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit8u i; 12484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 12494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima dest=((ystart*cheight*nbcols)>>1)+xstart; 12504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(i=0;i<cheight;i++) 12514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 12524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (i & 1) 12534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima memsetb(0xb800,0x2000+dest+(i>>1)*nbcols,attr,cols); 12544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 12554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima memsetb(0xb800,dest+(i>>1)*nbcols,attr,cols); 12564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 12574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 12584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 12594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 12604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_scroll (nblines,attr,rul,cul,rlr,clr,page,dir) 12614d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaBit8u nblines;Bit8u attr;Bit8u rul;Bit8u cul;Bit8u rlr;Bit8u clr;Bit8u page;Bit8u dir; 12624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 12634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // page == 0xFF if current 12644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 12654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit8u mode,line,cheight,bpp,cols; 12664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u nbcols,nbrows,i; 12674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u address; 12684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 12694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(rul>rlr)return; 12704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(cul>clr)return; 12714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 12724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Get the mode 12734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mode=read_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_MODE); 12744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima line=find_vga_entry(mode); 12754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(line==0xFF)return; 12764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 12774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Get the dimensions 12784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima nbrows=read_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS)+1; 12794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima nbcols=read_word(BIOSMEM_SEG,BIOSMEM_NB_COLS); 12804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 12814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Get the current page 12824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(page==0xFF) 12834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima page=read_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_PAGE); 12844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 12854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(rlr>=nbrows)rlr=nbrows-1; 12864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(clr>=nbcols)clr=nbcols-1; 12874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(nblines>nbrows)nblines=0; 12884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cols=clr-cul+1; 12894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 12904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(vga_modes[line].class==TEXT) 12914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 12924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Compute the address 12934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima address=SCREEN_MEM_START(nbcols,nbrows,page); 12944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 12954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima printf("Scroll, address %04x (%04x %04x %02x)\n",address,nbrows,nbcols,page); 12964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 12974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 12984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(nblines==0&&rul==0&&cul==0&&rlr==nbrows-1&&clr==nbcols-1) 12994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 13004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima memsetw(vga_modes[line].sstart,address,(Bit16u)attr*0x100+' ',nbrows*nbcols); 13014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 13024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 13034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima {// if Scroll up 13044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(dir==SCROLL_UP) 13054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima {for(i=rul;i<=rlr;i++) 13064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 13074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if((i+nblines>rlr)||(nblines==0)) 13084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima memsetw(vga_modes[line].sstart,address+(i*nbcols+cul)*2,(Bit16u)attr*0x100+' ',cols); 13094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 13104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima memcpyw(vga_modes[line].sstart,address+(i*nbcols+cul)*2,vga_modes[line].sstart,((i+nblines)*nbcols+cul)*2,cols); 13114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 13124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 13134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 13144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima {for(i=rlr;i>=rul;i--) 13154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 13164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if((i<rul+nblines)||(nblines==0)) 13174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima memsetw(vga_modes[line].sstart,address+(i*nbcols+cul)*2,(Bit16u)attr*0x100+' ',cols); 13184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 13194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima memcpyw(vga_modes[line].sstart,address+(i*nbcols+cul)*2,vga_modes[line].sstart,((i-nblines)*nbcols+cul)*2,cols); 13204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (i>rlr) break; 13214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 13224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 13234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 13244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 13254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 13264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 13274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // FIXME gfx mode not complete 13284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cheight=video_param_table[line_to_vpti[line]].cheight; 13294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima switch(vga_modes[line].memmodel) 13304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 13314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case PLANAR4: 13324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case PLANAR1: 13334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(nblines==0&&rul==0&&cul==0&&rlr==nbrows-1&&clr==nbcols-1) 13344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 13354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outw(VGAREG_GRDC_ADDRESS, 0x0205); 13364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima memsetb(vga_modes[line].sstart,0,attr,nbrows*nbcols*cheight); 13374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outw(VGAREG_GRDC_ADDRESS, 0x0005); 13384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 13394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 13404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima {// if Scroll up 13414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(dir==SCROLL_UP) 13424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima {for(i=rul;i<=rlr;i++) 13434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 13444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if((i+nblines>rlr)||(nblines==0)) 13454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima vgamem_fill_pl4(cul,i,cols,nbcols,cheight,attr); 13464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 13474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima vgamem_copy_pl4(cul,i+nblines,i,cols,nbcols,cheight); 13484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 13494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 13504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 13514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima {for(i=rlr;i>=rul;i--) 13524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 13534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if((i<rul+nblines)||(nblines==0)) 13544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima vgamem_fill_pl4(cul,i,cols,nbcols,cheight,attr); 13554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 13564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima vgamem_copy_pl4(cul,i,i-nblines,cols,nbcols,cheight); 13574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (i>rlr) break; 13584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 13594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 13604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 13614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 13624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case CGA: 13634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima bpp=vga_modes[line].pixbits; 13644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(nblines==0&&rul==0&&cul==0&&rlr==nbrows-1&&clr==nbcols-1) 13654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 13664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima memsetb(vga_modes[line].sstart,0,attr,nbrows*nbcols*cheight*bpp); 13674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 13684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 13694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 13704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(bpp==2) 13714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 13724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cul<<=1; 13734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cols<<=1; 13744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima nbcols<<=1; 13754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 13764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // if Scroll up 13774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(dir==SCROLL_UP) 13784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima {for(i=rul;i<=rlr;i++) 13794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 13804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if((i+nblines>rlr)||(nblines==0)) 13814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima vgamem_fill_cga(cul,i,cols,nbcols,cheight,attr); 13824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 13834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima vgamem_copy_cga(cul,i+nblines,i,cols,nbcols,cheight); 13844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 13854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 13864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 13874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima {for(i=rlr;i>=rul;i--) 13884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 13894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if((i<rul+nblines)||(nblines==0)) 13904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima vgamem_fill_cga(cul,i,cols,nbcols,cheight,attr); 13914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 13924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima vgamem_copy_cga(cul,i,i-nblines,cols,nbcols,cheight); 13934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (i>rlr) break; 13944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 13954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 13964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 13974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 13984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 13994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima default: 14004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima printf("Scroll in graphics mode "); 14014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima unimplemented(); 14024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 14034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 14044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 14054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 14064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 14074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 14084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_read_char_attr (page,car) 14094d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaBit8u page;Bit16u *car; 14104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{Bit16u ss=get_SS(); 14114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit8u xcurs,ycurs,mode,line; 14124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u nbcols,nbrows,address; 14134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u cursor,dummy; 14144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 14154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Get the mode 14164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mode=read_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_MODE); 14174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima line=find_vga_entry(mode); 14184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(line==0xFF)return; 14194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 14204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Get the cursor pos for the page 14214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_get_cursor_pos(page,&dummy,&cursor); 14224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima xcurs=cursor&0x00ff;ycurs=(cursor&0xff00)>>8; 14234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 14244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Get the dimensions 14254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima nbrows=read_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS)+1; 14264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima nbcols=read_word(BIOSMEM_SEG,BIOSMEM_NB_COLS); 14274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 14284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(vga_modes[line].class==TEXT) 14294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 14304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Compute the address 14314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima address=SCREEN_MEM_START(nbcols,nbrows,page)+(xcurs+ycurs*nbcols)*2; 14324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 14334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ss,car,read_word(vga_modes[line].sstart,address)); 14344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 14354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 14364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 14374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // FIXME gfx mode 14384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 14394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima unimplemented(); 14404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 14414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 14424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 14434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 14444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 14454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void write_gfx_char_pl4(car,attr,xcurs,ycurs,nbcols,cheight) 14464d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaBit8u car;Bit8u attr;Bit8u xcurs;Bit8u ycurs;Bit8u nbcols;Bit8u cheight; 14474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 14484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit8u i,j,mask; 14494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit8u *fdata; 14504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u addr,dest,src; 14514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 14524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima switch(cheight) 14534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima {case 14: 14544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima fdata = &vgafont14; 14554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 14564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 16: 14574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima fdata = &vgafont16; 14584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 14594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima default: 14604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima fdata = &vgafont8; 14614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 14624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima addr=xcurs+ycurs*cheight*nbcols; 14634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima src = car * cheight; 14644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outw(VGAREG_SEQU_ADDRESS, 0x0f02); 14654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outw(VGAREG_GRDC_ADDRESS, 0x0205); 14664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(attr&0x80) 14674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 14684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outw(VGAREG_GRDC_ADDRESS, 0x1803); 14694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 14704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 14714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 14724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outw(VGAREG_GRDC_ADDRESS, 0x0003); 14734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 14744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(i=0;i<cheight;i++) 14754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 14764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima dest=addr+i*nbcols; 14774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(j=0;j<8;j++) 14784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 14794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mask=0x80>>j; 14804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outw(VGAREG_GRDC_ADDRESS, (mask << 8) | 0x08); 14814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima read_byte(0xa000,dest); 14824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(fdata[src+i]&mask) 14834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 14844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(0xa000,dest,attr&0x0f); 14854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 14864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 14874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 14884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(0xa000,dest,0x00); 14894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 14904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 14914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 14924d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 14934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_GRDC_ADDRESS 14944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, #0xff08 14954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, ax 14964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, #0x0005 14974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, ax 14984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, #0x0003 14994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, ax 15004d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 15014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 15024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 15034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 15044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void write_gfx_char_cga(car,attr,xcurs,ycurs,nbcols,bpp) 15054d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaBit8u car;Bit8u attr;Bit8u xcurs;Bit8u ycurs;Bit8u nbcols;Bit8u bpp; 15064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 15074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit8u i,j,mask,data; 15084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit8u *fdata; 15094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u addr,dest,src; 15104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 15114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima fdata = &vgafont8; 15124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima addr=(xcurs*bpp)+ycurs*320; 15134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima src = car * 8; 15144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(i=0;i<8;i++) 15154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 15164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima dest=addr+(i>>1)*80; 15174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (i & 1) dest += 0x2000; 15184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mask = 0x80; 15194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (bpp == 1) 15204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 15214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (attr & 0x80) 15224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 15234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima data = read_byte(0xb800,dest); 15244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 15254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 15264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 15274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima data = 0x00; 15284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 15294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(j=0;j<8;j++) 15304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 15314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (fdata[src+i] & mask) 15324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 15334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (attr & 0x80) 15344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 15354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima data ^= (attr & 0x01) << (7-j); 15364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 15374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 15384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 15394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima data |= (attr & 0x01) << (7-j); 15404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 15414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 15424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mask >>= 1; 15434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 15444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(0xb800,dest,data); 15454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 15464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 15474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 15484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima while (mask > 0) 15494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 15504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (attr & 0x80) 15514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 15524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima data = read_byte(0xb800,dest); 15534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 15544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 15554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 15564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima data = 0x00; 15574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 15584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(j=0;j<4;j++) 15594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 15604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (fdata[src+i] & mask) 15614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 15624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (attr & 0x80) 15634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 15644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima data ^= (attr & 0x03) << ((3-j)*2); 15654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 15664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 15674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 15684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima data |= (attr & 0x03) << ((3-j)*2); 15694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 15704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 15714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mask >>= 1; 15724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 15734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(0xb800,dest,data); 15744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima dest += 1; 15754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 15764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 15774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 15784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 15794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 15804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 15814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void write_gfx_char_lin(car,attr,xcurs,ycurs,nbcols) 15824d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaBit8u car;Bit8u attr;Bit8u xcurs;Bit8u ycurs;Bit8u nbcols; 15834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 15844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit8u i,j,mask,data; 15854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit8u *fdata; 15864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u addr,dest,src; 15874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 15884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima fdata = &vgafont8; 15894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima addr=xcurs*8+ycurs*nbcols*64; 15904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima src = car * 8; 15914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(i=0;i<8;i++) 15924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 15934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima dest=addr+i*nbcols*8; 15944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mask = 0x80; 15954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(j=0;j<8;j++) 15964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 15974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima data = 0x00; 15984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (fdata[src+i] & mask) 15994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 16004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima data = attr; 16014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 16024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(0xa000,dest+j,data); 16034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mask >>= 1; 16044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 16054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 16064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 16074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 16084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 16094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_write_char_attr (car,page,attr,count) 16104d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaBit8u car;Bit8u page;Bit8u attr;Bit16u count; 16114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 16124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit8u cheight,xcurs,ycurs,mode,line,bpp; 16134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u nbcols,nbrows,address; 16144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u cursor,dummy; 16154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 16164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Get the mode 16174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mode=read_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_MODE); 16184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima line=find_vga_entry(mode); 16194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(line==0xFF)return; 16204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 16214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Get the cursor pos for the page 16224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_get_cursor_pos(page,&dummy,&cursor); 16234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima xcurs=cursor&0x00ff;ycurs=(cursor&0xff00)>>8; 16244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 16254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Get the dimensions 16264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima nbrows=read_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS)+1; 16274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima nbcols=read_word(BIOSMEM_SEG,BIOSMEM_NB_COLS); 16284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 16294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(vga_modes[line].class==TEXT) 16304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 16314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Compute the address 16324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima address=SCREEN_MEM_START(nbcols,nbrows,page)+(xcurs+ycurs*nbcols)*2; 16334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 16344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima dummy=((Bit16u)attr<<8)+car; 16354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima memsetw(vga_modes[line].sstart,address,dummy,count); 16364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 16374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 16384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 16394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // FIXME gfx mode not complete 16404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cheight=video_param_table[line_to_vpti[line]].cheight; 16414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima bpp=vga_modes[line].pixbits; 16424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima while((count-->0) && (xcurs<nbcols)) 16434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 16444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima switch(vga_modes[line].memmodel) 16454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 16464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case PLANAR4: 16474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case PLANAR1: 16484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_gfx_char_pl4(car,attr,xcurs,ycurs,nbcols,cheight); 16494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 16504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case CGA: 16514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_gfx_char_cga(car,attr,xcurs,ycurs,nbcols,bpp); 16524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 16534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case LINEAR8: 16544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_gfx_char_lin(car,attr,xcurs,ycurs,nbcols); 16554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 16564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 16574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima default: 16584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima unimplemented(); 16594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 16604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 16614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima xcurs++; 16624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 16634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 16644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 16654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 16664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 16674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_write_char_only (car,page,attr,count) 16684d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaBit8u car;Bit8u page;Bit8u attr;Bit16u count; 16694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 16704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit8u cheight,xcurs,ycurs,mode,line,bpp; 16714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u nbcols,nbrows,address; 16724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u cursor,dummy; 16734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 16744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Get the mode 16754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mode=read_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_MODE); 16764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima line=find_vga_entry(mode); 16774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(line==0xFF)return; 16784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 16794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Get the cursor pos for the page 16804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_get_cursor_pos(page,&dummy,&cursor); 16814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima xcurs=cursor&0x00ff;ycurs=(cursor&0xff00)>>8; 16824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 16834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Get the dimensions 16844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima nbrows=read_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS)+1; 16854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima nbcols=read_word(BIOSMEM_SEG,BIOSMEM_NB_COLS); 16864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 16874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(vga_modes[line].class==TEXT) 16884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 16894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Compute the address 16904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima address=SCREEN_MEM_START(nbcols,nbrows,page)+(xcurs+ycurs*nbcols)*2; 16914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 16924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima while(count-->0) 16934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima {write_byte(vga_modes[line].sstart,address,car); 16944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima address+=2; 16954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 16964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 16974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 16984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 16994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // FIXME gfx mode not complete 17004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cheight=video_param_table[line_to_vpti[line]].cheight; 17014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima bpp=vga_modes[line].pixbits; 17024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima while((count-->0) && (xcurs<nbcols)) 17034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 17044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima switch(vga_modes[line].memmodel) 17054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 17064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case PLANAR4: 17074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case PLANAR1: 17084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_gfx_char_pl4(car,attr,xcurs,ycurs,nbcols,cheight); 17094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 17104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case CGA: 17114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_gfx_char_cga(car,attr,xcurs,ycurs,nbcols,bpp); 17124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 17134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case LINEAR8: 17144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_gfx_char_lin(car,attr,xcurs,ycurs,nbcols); 17154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 17164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 17174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima default: 17184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima unimplemented(); 17194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 17204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 17214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima xcurs++; 17224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 17234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 17244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 17254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 17264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 17274d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 17284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabiosfn_group_0B: 17294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp bh, #0x00 17304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima je biosfn_set_border_color 17314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp bh, #0x01 17324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima je biosfn_set_palette 17334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 17344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call _unknown 17354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 17364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 17374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabiosfn_set_border_color: 17384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 17394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bx 17404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push cx 17414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push dx 17424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_RESET 17434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 17444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_ADDRESS 17454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #0x00 17464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 17474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, bl 17484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima and al, #0x0f 17494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima test al, #0x08 17504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jz set_low_border 17514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima add al, #0x08 17524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaset_low_border: 17534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 17544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov cl, #0x01 17554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima and bl, #0x10 17564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaset_intensity_loop: 17574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_ADDRESS 17584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, cl 17594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 17604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_READ_DATA 17614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 17624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima and al, #0xef 17634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima or al, bl 17644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_ADDRESS 17654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 17664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima inc cl 17674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp cl, #0x04 17684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne set_intensity_loop 17694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #0x20 17704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 17714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop dx 17724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop cx 17734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bx 17744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ax 17754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 17764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabiosfn_set_palette: 17774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 17784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bx 17794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push cx 17804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push dx 17814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_RESET 17824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 17834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov cl, #0x01 17844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima and bl, #0x01 17854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaset_cga_palette_loop: 17864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_ADDRESS 17874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, cl 17884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 17894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_READ_DATA 17904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 17914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima and al, #0xfe 17924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima or al, bl 17934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_ADDRESS 17944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 17954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima inc cl 17964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp cl, #0x04 17974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne set_cga_palette_loop 17984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #0x20 17994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 18004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop dx 18014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop cx 18024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bx 18034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ax 18044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 18054d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 18064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 18074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 18084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_write_pixel (BH,AL,CX,DX) Bit8u BH;Bit8u AL;Bit16u CX;Bit16u DX; 18094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 18104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit8u mode,line,mask,attr,data; 18114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u addr; 18124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 18134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Get the mode 18144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mode=read_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_MODE); 18154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima line=find_vga_entry(mode); 18164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(line==0xFF)return; 18174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(vga_modes[line].class==TEXT)return; 18184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 18194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima switch(vga_modes[line].memmodel) 18204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 18214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case PLANAR4: 18224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case PLANAR1: 18234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima addr = CX/8+DX*read_word(BIOSMEM_SEG,BIOSMEM_NB_COLS); 18244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mask = 0x80 >> (CX & 0x07); 18254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outw(VGAREG_GRDC_ADDRESS, (mask << 8) | 0x08); 18264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outw(VGAREG_GRDC_ADDRESS, 0x0205); 18274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima data = read_byte(0xa000,addr); 18284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (AL & 0x80) 18294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 18304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outw(VGAREG_GRDC_ADDRESS, 0x1803); 18314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 18324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(0xa000,addr,AL); 18334d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 18344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_GRDC_ADDRESS 18354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, #0xff08 18364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, ax 18374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, #0x0005 18384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, ax 18394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, #0x0003 18404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, ax 18414d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 18424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 18434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case CGA: 18444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(vga_modes[line].pixbits==2) 18454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 18464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima addr=(CX>>2)+(DX>>1)*80; 18474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 18484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 18494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 18504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima addr=(CX>>3)+(DX>>1)*80; 18514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 18524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (DX & 1) addr += 0x2000; 18534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima data = read_byte(0xb800,addr); 18544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(vga_modes[line].pixbits==2) 18554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 18564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima attr = (AL & 0x03) << ((3 - (CX & 0x03)) * 2); 18574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mask = 0x03 << ((3 - (CX & 0x03)) * 2); 18584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 18594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 18604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 18614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima attr = (AL & 0x01) << (7 - (CX & 0x07)); 18624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mask = 0x01 << (7 - (CX & 0x07)); 18634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 18644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (AL & 0x80) 18654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 18664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima data ^= attr; 18674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 18684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 18694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 18704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima data &= ~mask; 18714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima data |= attr; 18724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 18734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(0xb800,addr,data); 18744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 18754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case LINEAR8: 18764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima addr=CX+DX*(read_word(BIOSMEM_SEG,BIOSMEM_NB_COLS)*8); 18774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(0xa000,addr,AL); 18784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 18794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 18804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima default: 18814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima unimplemented(); 18824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 18834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 18844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 18854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 18864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 18874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_read_pixel (BH,CX,DX,AX) Bit8u BH;Bit16u CX;Bit16u DX;Bit16u *AX; 18884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 18894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit8u mode,line,mask,attr,data,i; 18904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u addr; 18914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u ss=get_SS(); 18924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 18934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Get the mode 18944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mode=read_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_MODE); 18954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima line=find_vga_entry(mode); 18964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(line==0xFF)return; 18974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(vga_modes[line].class==TEXT)return; 18984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 18994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima switch(vga_modes[line].memmodel) 19004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 19014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case PLANAR4: 19024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case PLANAR1: 19034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima addr = CX/8+DX*read_word(BIOSMEM_SEG,BIOSMEM_NB_COLS); 19044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mask = 0x80 >> (CX & 0x07); 19054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima attr = 0x00; 19064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(i=0;i<4;i++) 19074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 19084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outw(VGAREG_GRDC_ADDRESS, (i << 8) | 0x04); 19094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima data = read_byte(0xa000,addr) & mask; 19104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (data > 0) attr |= (0x01 << i); 19114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 19124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 19134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case CGA: 19144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima addr=(CX>>2)+(DX>>1)*80; 19154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (DX & 1) addr += 0x2000; 19164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima data = read_byte(0xb800,addr); 19174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(vga_modes[line].pixbits==2) 19184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 19194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima attr = (data >> ((3 - (CX & 0x03)) * 2)) & 0x03; 19204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 19214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 19224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 19234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima attr = (data >> (7 - (CX & 0x07))) & 0x01; 19244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 19254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 19264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case LINEAR8: 19274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima addr=CX+DX*(read_word(BIOSMEM_SEG,BIOSMEM_NB_COLS)*8); 19284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima attr=read_byte(0xa000,addr); 19294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 19304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima default: 19314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 19324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima unimplemented(); 19334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 19344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima attr = 0; 19354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 19364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ss,AX,(read_word(ss,AX) & 0xff00) | attr); 19374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 19384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 19394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 19404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_write_teletype (car, page, attr, flag) 19414d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaBit8u car;Bit8u page;Bit8u attr;Bit8u flag; 19424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{// flag = WITH_ATTR / NO_ATTR 19434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 19444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit8u cheight,xcurs,ycurs,mode,line,bpp; 19454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u nbcols,nbrows,address; 19464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u cursor,dummy; 19474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 19484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // special case if page is 0xff, use current page 19494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(page==0xff) 19504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima page=read_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_PAGE); 19514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 19524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Get the mode 19534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mode=read_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_MODE); 19544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima line=find_vga_entry(mode); 19554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(line==0xFF)return; 19564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 19574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Get the cursor pos for the page 19584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_get_cursor_pos(page,&dummy,&cursor); 19594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima xcurs=cursor&0x00ff;ycurs=(cursor&0xff00)>>8; 19604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 19614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Get the dimensions 19624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima nbrows=read_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS)+1; 19634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima nbcols=read_word(BIOSMEM_SEG,BIOSMEM_NB_COLS); 19644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 19654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima switch(car) 19664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 19674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 7: 19684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima //FIXME should beep 19694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 19704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 19714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 8: 19724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(xcurs>0)xcurs--; 19734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 19744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 19754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case '\r': 19764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima xcurs=0; 19774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 19784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 19794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case '\n': 19804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ycurs++; 19814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 19824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 19834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case '\t': 19844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima do 19854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 19864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_write_teletype(' ',page,attr,flag); 19874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_get_cursor_pos(page,&dummy,&cursor); 19884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima xcurs=cursor&0x00ff;ycurs=(cursor&0xff00)>>8; 19894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima }while(xcurs%8==0); 19904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 19914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 19924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima default: 19934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 19944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(vga_modes[line].class==TEXT) 19954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 19964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Compute the address 19974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima address=SCREEN_MEM_START(nbcols,nbrows,page)+(xcurs+ycurs*nbcols)*2; 19984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 19994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Write the char 20004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(vga_modes[line].sstart,address,car); 20014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 20024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(flag==WITH_ATTR) 20034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(vga_modes[line].sstart,address+1,attr); 20044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 20054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 20064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 20074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // FIXME gfx mode not complete 20084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cheight=video_param_table[line_to_vpti[line]].cheight; 20094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima bpp=vga_modes[line].pixbits; 20104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima switch(vga_modes[line].memmodel) 20114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 20124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case PLANAR4: 20134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case PLANAR1: 20144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_gfx_char_pl4(car,attr,xcurs,ycurs,nbcols,cheight); 20154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 20164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case CGA: 20174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_gfx_char_cga(car,attr,xcurs,ycurs,nbcols,bpp); 20184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 20194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case LINEAR8: 20204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_gfx_char_lin(car,attr,xcurs,ycurs,nbcols); 20214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 20224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 20234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima default: 20244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima unimplemented(); 20254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 20264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 20274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 20284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima xcurs++; 20294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 20304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 20314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Do we need to wrap ? 20324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(xcurs==nbcols) 20334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima {xcurs=0; 20344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ycurs++; 20354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 20364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 20374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Do we need to scroll ? 20384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(ycurs==nbrows) 20394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 20404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(vga_modes[line].class==TEXT) 20414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 20424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima address=SCREEN_MEM_START(nbcols,nbrows,page)+(xcurs+(ycurs-1)*nbcols)*2; 20434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima attr=read_byte(vga_modes[line].sstart,address+1); 20444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_scroll(0x01,attr,0,0,nbrows-1,nbcols-1,page,SCROLL_UP); 20454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 20464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 20474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 20484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_scroll(0x01,0x00,0,0,nbrows-1,nbcols-1,page,SCROLL_UP); 20494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 20504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ycurs-=1; 20514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 20524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 20534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Set the cursor for the page 20544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cursor=ycurs; cursor<<=8; cursor+=xcurs; 20554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_set_cursor_pos(page,cursor); 20564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 20574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 20584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 20594d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 20604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabiosfn_get_video_mode: 20614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ds 20624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, # BIOSMEM_SEG 20634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ds, ax 20644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bx 20654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, # BIOSMEM_CURRENT_PAGE 20664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, [bx] 20674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bx 20684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bh, al 20694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bx 20704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, # BIOSMEM_VIDEO_CTL 20714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ah, [bx] 20724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima and ah, #0x80 20734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, # BIOSMEM_CURRENT_MODE 20744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, [bx] 20754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima or al, ah 20764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, # BIOSMEM_NB_COLS 20774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ah, [bx] 20784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bx 20794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ds 20804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 20814d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 20824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 20834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 20844d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 20854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabiosfn_group_10: 20864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x00 20874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_test_1001 20884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp biosfn_set_single_palette_reg 20894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_test_1001: 20904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x01 20914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_test_1002 20924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp biosfn_set_overscan_border_color 20934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_test_1002: 20944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x02 20954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_test_1003 20964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp biosfn_set_all_palette_reg 20974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_test_1003: 20984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x03 20994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_test_1007 21004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp biosfn_toggle_intensity 21014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_test_1007: 21024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x07 21034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_test_1008 21044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp biosfn_get_single_palette_reg 21054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_test_1008: 21064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x08 21074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_test_1009 21084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp biosfn_read_overscan_border_color 21094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_test_1009: 21104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x09 21114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_test_1010 21124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp biosfn_get_all_palette_reg 21134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_test_1010: 21144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x10 21154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_test_1012 21164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp biosfn_set_single_dac_reg 21174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_test_1012: 21184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x12 21194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_test_1013 21204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp biosfn_set_all_dac_reg 21214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_test_1013: 21224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x13 21234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_test_1015 21244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp biosfn_select_video_dac_color_page 21254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_test_1015: 21264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x15 21274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_test_1017 21284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp biosfn_read_single_dac_reg 21294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_test_1017: 21304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x17 21314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_test_1018 21324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp biosfn_read_all_dac_reg 21334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_test_1018: 21344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x18 21354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_test_1019 21364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp biosfn_set_pel_mask 21374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_test_1019: 21384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x19 21394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_test_101A 21404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp biosfn_read_pel_mask 21414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_test_101A: 21424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x1a 21434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne int10_group_10_unknown 21444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp biosfn_read_video_dac_state 21454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaint10_group_10_unknown: 21464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 21474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call _unknown 21484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 21494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 21504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 21514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabiosfn_set_single_palette_reg: 21524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp bl, #0x14 21534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ja no_actl_reg1 21544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 21554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push dx 21564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_RESET 21574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 21584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_ADDRESS 21594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, bl 21604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 21614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, bh 21624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 21634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #0x20 21644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 21654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop dx 21664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ax 21674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimano_actl_reg1: 21684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 21694d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 21704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 21714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 21724d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 21734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabiosfn_set_overscan_border_color: 21744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bx 21754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bl, #0x11 21764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call biosfn_set_single_palette_reg 21774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bx 21784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 21794d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 21804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 21814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 21824d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 21834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabiosfn_set_all_palette_reg: 21844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 21854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bx 21864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push cx 21874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push dx 21884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, dx 21894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_RESET 21904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 21914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov cl, #0x00 21924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_ADDRESS 21934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaset_palette_loop: 21944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, cl 21954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 21964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima seg es 21974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, [bx] 21984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 21994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima inc bx 22004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima inc cl 22014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp cl, #0x10 22024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne set_palette_loop 22034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #0x11 22044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 22054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima seg es 22064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, [bx] 22074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 22084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #0x20 22094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 22104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop dx 22114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop cx 22124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bx 22134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ax 22144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 22154d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 22164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 22174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 22184d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 22194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabiosfn_toggle_intensity: 22204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 22214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bx 22224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push dx 22234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_RESET 22244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 22254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_ADDRESS 22264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #0x10 22274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 22284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_READ_DATA 22294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 22304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima and al, #0xf7 22314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima and bl, #0x01 22324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima shl bl, 3 22334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima or al, bl 22344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_ADDRESS 22354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 22364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #0x20 22374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 22384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop dx 22394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bx 22404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ax 22414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 22424d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 22434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 22444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 22454d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 22464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabiosfn_get_single_palette_reg: 22474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp bl, #0x14 22484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ja no_actl_reg2 22494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 22504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push dx 22514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_RESET 22524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 22534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_ADDRESS 22544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, bl 22554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 22564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_READ_DATA 22574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 22584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bh, al 22594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_RESET 22604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 22614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_ADDRESS 22624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #0x20 22634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 22644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop dx 22654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ax 22664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimano_actl_reg2: 22674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 22684d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 22694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 22704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 22714d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 22724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabiosfn_read_overscan_border_color: 22734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 22744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bx 22754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bl, #0x11 22764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call biosfn_get_single_palette_reg 22774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, bh 22784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bx 22794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bh, al 22804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ax 22814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 22824d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 22834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 22844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 22854d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 22864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabiosfn_get_all_palette_reg: 22874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 22884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bx 22894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push cx 22904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push dx 22914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, dx 22924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov cl, #0x00 22934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaget_palette_loop: 22944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_RESET 22954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 22964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_ADDRESS 22974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, cl 22984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 22994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_READ_DATA 23004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 23014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima seg es 23024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov [bx], al 23034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima inc bx 23044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima inc cl 23054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp cl, #0x10 23064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne get_palette_loop 23074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_RESET 23084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 23094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_ADDRESS 23104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #0x11 23114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 23124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_READ_DATA 23134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 23144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima seg es 23154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov [bx], al 23164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_RESET 23174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 23184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_ADDRESS 23194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #0x20 23204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 23214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop dx 23224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop cx 23234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bx 23244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ax 23254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 23264d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 23274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 23284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 23294d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 23304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabiosfn_set_single_dac_reg: 23314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 23324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push dx 23334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_DAC_WRITE_ADDRESS 23344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, bl 23354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 23364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_DAC_DATA 23374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ax 23384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 23394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, ah 23404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 23414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, ch 23424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 23434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, cl 23444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 23454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop dx 23464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ax 23474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 23484d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 23494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 23504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 23514d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 23524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabiosfn_set_all_dac_reg: 23534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 23544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bx 23554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push cx 23564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push dx 23574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_DAC_WRITE_ADDRESS 23584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, bl 23594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 23604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop dx 23614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push dx 23624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, dx 23634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_DAC_DATA 23644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaset_dac_loop: 23654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima seg es 23664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, [bx] 23674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 23684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima inc bx 23694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima seg es 23704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, [bx] 23714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 23724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima inc bx 23734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima seg es 23744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, [bx] 23754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 23764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima inc bx 23774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima dec cx 23784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jnz set_dac_loop 23794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop dx 23804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop cx 23814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bx 23824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ax 23834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 23844d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 23854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 23864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 23874d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 23884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabiosfn_select_video_dac_color_page: 23894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 23904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bx 23914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push dx 23924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_RESET 23934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 23944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_ADDRESS 23954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #0x10 23964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 23974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_READ_DATA 23984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 23994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima and bl, #0x01 24004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jnz set_dac_page 24014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima and al, #0x7f 24024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima shl bh, 7 24034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima or al, bh 24044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_ADDRESS 24054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 24064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp set_actl_normal 24074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaset_dac_page: 24084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 24094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_RESET 24104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 24114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_ADDRESS 24124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #0x14 24134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 24144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ax 24154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima and al, #0x80 24164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jnz set_dac_16_page 24174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima shl bh, 2 24184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaset_dac_16_page: 24194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima and bh, #0x0f 24204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, bh 24214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 24224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaset_actl_normal: 24234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #0x20 24244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 24254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop dx 24264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bx 24274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ax 24284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 24294d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 24304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 24314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 24324d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 24334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabiosfn_read_single_dac_reg: 24344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 24354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push dx 24364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_DAC_READ_ADDRESS 24374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, bl 24384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 24394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ax 24404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ah, al 24414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_DAC_DATA 24424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 24434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima xchg al, ah 24444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 24454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 24464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ch, al 24474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 24484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov cl, al 24494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop dx 24504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ax 24514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 24524d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 24534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 24544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 24554d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 24564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabiosfn_read_all_dac_reg: 24574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 24584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bx 24594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push cx 24604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push dx 24614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_DAC_READ_ADDRESS 24624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, bl 24634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 24644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop dx 24654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push dx 24664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, dx 24674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_DAC_DATA 24684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaread_dac_loop: 24694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 24704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima seg es 24714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov [bx], al 24724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima inc bx 24734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 24744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima seg es 24754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov [bx], al 24764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima inc bx 24774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 24784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima seg es 24794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov [bx], al 24804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima inc bx 24814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima dec cx 24824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jnz read_dac_loop 24834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop dx 24844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop cx 24854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bx 24864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ax 24874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 24884d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 24894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 24904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 24914d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 24924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabiosfn_set_pel_mask: 24934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 24944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push dx 24954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_PEL_MASK 24964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, bl 24974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 24984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop dx 24994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ax 25004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 25014d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 25024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 25034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 25044d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 25054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabiosfn_read_pel_mask: 25064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 25074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push dx 25084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_PEL_MASK 25094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 25104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bl, al 25114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop dx 25124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ax 25134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 25144d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 25154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 25164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 25174d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 25184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabiosfn_read_video_dac_state: 25194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 25204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push dx 25214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_RESET 25224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 25234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_ADDRESS 25244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #0x10 25254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 25264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_READ_DATA 25274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 25284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bl, al 25294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima shr bl, 7 25304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_RESET 25314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 25324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_ADDRESS 25334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #0x14 25344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 25354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_READ_DATA 25364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 25374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bh, al 25384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima and bh, #0x0f 25394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima test bl, #0x01 25404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jnz get_dac_16_page 25414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima shr bh, 2 25424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaget_dac_16_page: 25434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_RESET 25444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 25454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_ACTL_ADDRESS 25464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #0x20 25474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 25484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop dx 25494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ax 25504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 25514d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 25524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 25534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 25544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_perform_gray_scale_summing (start,count) 25554d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaBit16u start;Bit16u count; 25564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{Bit8u r,g,b; 25574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u i; 25584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u index; 25594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 25604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima inb(VGAREG_ACTL_RESET); 25614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_ACTL_ADDRESS,0x00); 25624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 25634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for( index = 0; index < count; index++ ) 25644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 25654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // set read address and switch to read mode 25664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_DAC_READ_ADDRESS,start); 25674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // get 6-bit wide RGB data values 25684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima r=inb( VGAREG_DAC_DATA ); 25694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima g=inb( VGAREG_DAC_DATA ); 25704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima b=inb( VGAREG_DAC_DATA ); 25714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 25724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // intensity = ( 0.3 * Red ) + ( 0.59 * Green ) + ( 0.11 * Blue ) 25734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima i = ( ( 77*r + 151*g + 28*b ) + 0x80 ) >> 8; 25744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 25754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(i>0x3f)i=0x3f; 25764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 25774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // set write address and switch to write mode 25784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_DAC_WRITE_ADDRESS,start); 25794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // write new intensity value 25804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb( VGAREG_DAC_DATA, i&0xff ); 25814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb( VGAREG_DAC_DATA, i&0xff ); 25824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb( VGAREG_DAC_DATA, i&0xff ); 25834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima start++; 25844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 25854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima inb(VGAREG_ACTL_RESET); 25864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_ACTL_ADDRESS,0x20); 25874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 25884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 25894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 25904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void get_font_access() 25914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 25924d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 25934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_SEQU_ADDRESS 25944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, #0x0100 25954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, ax 25964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, #0x0402 25974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, ax 25984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, #0x0704 25994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, ax 26004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, #0x0300 26014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, ax 26024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_GRDC_ADDRESS 26034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, #0x0204 26044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, ax 26054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, #0x0005 26064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, ax 26074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, #0x0406 26084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, ax 26094d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 26104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 26114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 26124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void release_font_access() 26134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 26144d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 26154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_SEQU_ADDRESS 26164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, #0x0100 26174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, ax 26184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, #0x0302 26194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, ax 26204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, #0x0304 26214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, ax 26224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, #0x0300 26234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, ax 26244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_READ_MISC_OUTPUT 26254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 26264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima and al, #0x01 26274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima shl al, 2 26284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima or al, #0x0a 26294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ah, al 26304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #0x06 26314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_GRDC_ADDRESS 26324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, ax 26334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, #0x0004 26344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, ax 26354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, #0x1005 26364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, ax 26374d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 26384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 26394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 26404d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 26414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaidiv_u: 26424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima xor dx,dx 26434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima div bx 26444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 26454d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 26464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 26474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void set_scan_lines(lines) Bit8u lines; 26484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 26494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u crtc_addr,cols,page,vde; 26504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit8u crtc_r9,ovl,rows; 26514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 26524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima crtc_addr = read_word(BIOSMEM_SEG,BIOSMEM_CRTC_ADDRESS); 26534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(crtc_addr, 0x09); 26544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima crtc_r9 = inb(crtc_addr+1); 26554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima crtc_r9 = (crtc_r9 & 0xe0) | (lines - 1); 26564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(crtc_addr+1, crtc_r9); 26574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(lines==8) 26584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 26594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_set_cursor_shape(0x06,0x07); 26604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 26614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 26624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 26634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_set_cursor_shape(lines-4,lines-3); 26644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 26654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(BIOSMEM_SEG,BIOSMEM_CHAR_HEIGHT, lines); 26664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(crtc_addr, 0x12); 26674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima vde = inb(crtc_addr+1); 26684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(crtc_addr, 0x07); 26694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ovl = inb(crtc_addr+1); 26704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima vde += (((ovl & 0x02) << 7) + ((ovl & 0x40) << 3) + 1); 26714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima rows = vde / lines; 26724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, rows-1); 26734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cols = read_word(BIOSMEM_SEG,BIOSMEM_NB_COLS); 26744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(BIOSMEM_SEG,BIOSMEM_PAGE_SIZE, rows * cols * 2); 26754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 26764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 26774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_load_text_user_pat (AL,ES,BP,CX,DX,BL,BH) Bit8u AL;Bit16u ES;Bit16u BP;Bit16u CX;Bit16u DX;Bit8u BL;Bit8u BH; 26784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 26794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u blockaddr,dest,i,src; 26804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 26814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima get_font_access(); 26824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima blockaddr = ((BL & 0x03) << 14) + ((BL & 0x04) << 11); 26834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(i=0;i<CX;i++) 26844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 26854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima src = BP + i * BH; 26864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima dest = blockaddr + (DX + i) * 32; 26874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima memcpyb(0xA000, dest, ES, src, BH); 26884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 26894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima release_font_access(); 26904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(AL>=0x10) 26914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 26924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima set_scan_lines(BH); 26934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 26944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 26954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 26964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_load_text_8_14_pat (AL,BL) Bit8u AL;Bit8u BL; 26974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 26984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u blockaddr,dest,i,src; 26994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 27004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima get_font_access(); 27014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima blockaddr = ((BL & 0x03) << 14) + ((BL & 0x04) << 11); 27024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(i=0;i<0x100;i++) 27034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 27044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima src = i * 14; 27054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima dest = blockaddr + i * 32; 27064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima memcpyb(0xA000, dest, 0xC000, vgafont14+src, 14); 27074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 27084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima release_font_access(); 27094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(AL>=0x10) 27104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 27114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima set_scan_lines(14); 27124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 27134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 27144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 27154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_load_text_8_8_pat (AL,BL) Bit8u AL;Bit8u BL; 27164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 27174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u blockaddr,dest,i,src; 27184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 27194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima get_font_access(); 27204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima blockaddr = ((BL & 0x03) << 14) + ((BL & 0x04) << 11); 27214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(i=0;i<0x100;i++) 27224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 27234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima src = i * 8; 27244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima dest = blockaddr + i * 32; 27254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima memcpyb(0xA000, dest, 0xC000, vgafont8+src, 8); 27264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 27274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima release_font_access(); 27284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(AL>=0x10) 27294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 27304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima set_scan_lines(8); 27314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 27324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 27334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 27344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 27354d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 27364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabiosfn_set_text_block_specifier: 27374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 27384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push dx 27394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_SEQU_ADDRESS 27404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ah, bl 27414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, #0x03 27424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, ax 27434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop dx 27444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ax 27454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 27464d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 27474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 27484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 27494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_load_text_8_16_pat (AL,BL) Bit8u AL;Bit8u BL; 27504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 27514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u blockaddr,dest,i,src; 27524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 27534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima get_font_access(); 27544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima blockaddr = ((BL & 0x03) << 14) + ((BL & 0x04) << 11); 27554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(i=0;i<0x100;i++) 27564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 27574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima src = i * 16; 27584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima dest = blockaddr + i * 32; 27594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima memcpyb(0xA000, dest, 0xC000, vgafont16+src, 16); 27604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 27614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima release_font_access(); 27624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(AL>=0x10) 27634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 27644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima set_scan_lines(16); 27654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 27664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 27674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 27684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_load_gfx_8_8_chars (ES,BP) Bit16u ES;Bit16u BP; 27694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 27704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 27714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima unimplemented(); 27724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 27734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 27744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_load_gfx_user_chars (ES,BP,CX,BL,DL) Bit16u ES;Bit16u BP;Bit16u CX;Bit8u BL;Bit8u DL; 27754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 27764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 27774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima unimplemented(); 27784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 27794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 27804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_load_gfx_8_14_chars (BL) Bit8u BL; 27814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 27824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 27834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima unimplemented(); 27844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 27854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 27864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_load_gfx_8_8_dd_chars (BL) Bit8u BL; 27874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 27884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 27894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima unimplemented(); 27904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 27914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 27924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_load_gfx_8_16_chars (BL) Bit8u BL; 27934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 27944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 27954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima unimplemented(); 27964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 27974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 27984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 27994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_get_font_info (BH,ES,BP,CX,DX) 28004d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaBit8u BH;Bit16u *ES;Bit16u *BP;Bit16u *CX;Bit16u *DX; 28014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{Bit16u ss=get_SS(); 28024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 28034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima switch(BH) 28044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima {case 0x00: 28054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ss,ES,read_word(0x00,0x1f*4)); 28064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ss,BP,read_word(0x00,(0x1f*4)+2)); 28074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 28084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x01: 28094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ss,ES,read_word(0x00,0x43*4)); 28104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ss,BP,read_word(0x00,(0x43*4)+2)); 28114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 28124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x02: 28134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ss,ES,0xC000); 28144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ss,BP,vgafont14); 28154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 28164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x03: 28174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ss,ES,0xC000); 28184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ss,BP,vgafont8); 28194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 28204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x04: 28214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ss,ES,0xC000); 28224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ss,BP,vgafont8+128*8); 28234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 28244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x05: 28254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ss,ES,0xC000); 28264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ss,BP,vgafont14alt); 28274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 28284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x06: 28294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ss,ES,0xC000); 28304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ss,BP,vgafont16); 28314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 28324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima case 0x07: 28334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ss,ES,0xC000); 28344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ss,BP,vgafont16alt); 28354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 28364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima default: 28374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima #ifdef DEBUG 28384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima printf("Get font info BH(%02x) was discarded\n",BH); 28394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima #endif 28404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima return; 28414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 28424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Set byte/char of on screen font 28434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ss,CX,(Bit16u)read_byte(BIOSMEM_SEG,BIOSMEM_CHAR_HEIGHT)); 28444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 28454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Set Highest char row 28464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ss,DX,(Bit16u)read_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS)); 28474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 28484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 28494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 28504d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 28514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabiosfn_get_ega_info: 28524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ds 28534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 28544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, # BIOSMEM_SEG 28554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ds, ax 28564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima xor ch, ch 28574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, # BIOSMEM_SWITCHES 28584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov cl, [bx] 28594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima and cl, #0x0f 28604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, # BIOSMEM_CRTC_ADDRESS 28614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, [bx] 28624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, #0x0003 28634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp ax, # VGAREG_MDA_CRTC_ADDRESS 28644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne mode_ega_color 28654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bh, #0x01 28664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimamode_ega_color: 28674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ax 28684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ds 28694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 28704d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 28714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 28724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 28734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_alternate_prtsc() 28744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 28754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 28764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima unimplemented(); 28774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 28784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 28794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 28804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 28814d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 28824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabiosfn_select_vert_res: 28834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 28844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima; res : 00 200 lines, 01 350 lines, 02 400 lines 28854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 28864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ds 28874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bx 28884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push dx 28894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dl, al 28904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, # BIOSMEM_SEG 28914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ds, ax 28924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, # BIOSMEM_MODESET_CTL 28934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, [bx] 28944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, # BIOSMEM_SWITCHES 28954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ah, [bx] 28964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp dl, #0x01 28974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima je vert_res_350 28984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jb vert_res_200 28994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp dl, #0x02 29004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima je vert_res_400 29014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 29024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, dl 29034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima xor ah, ah 29044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 29054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, #msg_vert_res 29064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bx 29074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call _printf 29084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima add sp, #4 29094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 29104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp set_retcode 29114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavert_res_400: 29124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 29134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ; reset modeset ctl bit 7 and set bit 4 29144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ; set switches bit 3-0 to 0x09 29154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 29164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima and al, #0x7f 29174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima or al, #0x10 29184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima and ah, #0xf0 29194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima or ah, #0x09 29204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jnz set_vert_res 29214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavert_res_350: 29224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 29234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ; reset modeset ctl bit 7 and bit 4 29244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ; set switches bit 3-0 to 0x09 29254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 29264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima and al, #0x6f 29274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima and ah, #0xf0 29284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima or ah, #0x09 29294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jnz set_vert_res 29304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavert_res_200: 29314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 29324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ; set modeset ctl bit 7 and reset bit 4 29334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ; set switches bit 3-0 to 0x08 29344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 29354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima and al, #0xef 29364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima or al, #0x80 29374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima and ah, #0xf0 29384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima or ah, #0x08 29394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaset_vert_res: 29404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, # BIOSMEM_MODESET_CTL 29414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov [bx], al 29424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, # BIOSMEM_SWITCHES 29434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov [bx], ah 29444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaset_retcode: 29454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, #0x1212 29464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop dx 29474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bx 29484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ds 29494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 29504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 29514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 29524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimamsg_vert_res: 29534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.ascii "Select vert res (%02x) was discarded" 29544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte 0x0d,0x0a,0x00 29554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 29564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 29574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 29584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabiosfn_enable_default_palette_loading: 29594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ds 29604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bx 29614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push dx 29624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dl, al 29634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima and dl, #0x01 29644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima shl dl, 3 29654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, # BIOSMEM_SEG 29664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ds, ax 29674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, # BIOSMEM_MODESET_CTL 29684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, [bx] 29694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima and al, #0xf7 29704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima or al, dl 29714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov [bx], al 29724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, #0x1212 29734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop dx 29744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bx 29754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ds 29764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 29774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 29784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 29794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabiosfn_enable_video_addressing: 29804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bx 29814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push dx 29824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bl, al 29834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima and bl, #0x01 29844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima xor bl, #0x01 29854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima shl bl, 1 29864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_READ_MISC_OUTPUT 29874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 29884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima and al, #0xfd 29894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima or al, bl 29904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, # VGAREG_WRITE_MISC_OUTPUT 29914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 29924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, #0x1212 29934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop dx 29944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bx 29954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 29964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 29974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 29984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabiosfn_enable_grayscale_summing: 29994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ds 30004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bx 30014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push dx 30024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dl, al 30034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima and dl, #0x01 30044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima xor dl, #0x01 30054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima shl dl, 1 30064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, # BIOSMEM_SEG 30074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ds, ax 30084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, # BIOSMEM_MODESET_CTL 30094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, [bx] 30104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima and al, #0xfd 30114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima or al, dl 30124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov [bx], al 30134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, #0x1212 30144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop dx 30154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bx 30164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ds 30174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 30184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 30194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 30204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabiosfn_enable_cursor_emulation: 30214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ds 30224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bx 30234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push dx 30244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dl, al 30254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima and dl, #0x01 30264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima xor dl, #0x01 30274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, # BIOSMEM_SEG 30284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ds, ax 30294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, # BIOSMEM_MODESET_CTL 30304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, [bx] 30314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima and al, #0xfe 30324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima or al, dl 30334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov [bx], al 30344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, #0x1212 30354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop dx 30364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bx 30374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ds 30384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 30394d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 30404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 30414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 30424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_switch_video_interface (AL,ES,DX) Bit8u AL;Bit16u ES;Bit16u DX; 30434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 30444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 30454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima unimplemented(); 30464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 30474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 30484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_enable_video_refresh_control (AL) Bit8u AL; 30494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 30504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 30514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima unimplemented(); 30524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 30534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 30544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 30554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 30564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_write_string (flag,page,attr,count,row,col,seg,offset) 30574d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaBit8u flag;Bit8u page;Bit8u attr;Bit16u count;Bit8u row;Bit8u col;Bit16u seg;Bit16u offset; 30584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 30594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u newcurs,oldcurs,dummy; 30604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit8u car,carattr; 30614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 30624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Read curs info for the page 30634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_get_cursor_pos(page,&dummy,&oldcurs); 30644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 30654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // if row=0xff special case : use current cursor position 30664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(row==0xff) 30674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima {col=oldcurs&0x00ff; 30684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima row=(oldcurs&0xff00)>>8; 30694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 30704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 30714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima newcurs=row; newcurs<<=8; newcurs+=col; 30724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_set_cursor_pos(page,newcurs); 30734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 30744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima while(count--!=0) 30754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima { 30764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima car=read_byte(seg,offset++); 30774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if((flag&0x02)!=0) 30784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima attr=read_byte(seg,offset++); 30794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 30804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_write_teletype(car,page,attr,WITH_ATTR); 30814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 30824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 30834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Set back curs pos 30844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if((flag&0x01)==0) 30854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima biosfn_set_cursor_pos(page,oldcurs); 30864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 30874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 30884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 30894d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 30904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabiosfn_group_1A: 30914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x00 30924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima je biosfn_read_display_code 30934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp al, #0x01 30944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima je biosfn_set_display_code 30954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 30964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call _unknown 30974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 30984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 30994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabiosfn_read_display_code: 31004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ds 31014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 31024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, # BIOSMEM_SEG 31034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ds, ax 31044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, # BIOSMEM_DCC_INDEX 31054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, [bx] 31064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bl, al 31074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima xor bh, bh 31084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ax 31094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, ah 31104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ds 31114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 31124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimabiosfn_set_display_code: 31134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ds 31144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 31154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bx 31164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, # BIOSMEM_SEG 31174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ds, ax 31184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, bx 31194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, # BIOSMEM_DCC_INDEX 31204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov [bx], al 31214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 31224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, ah 31234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima xor ah, ah 31244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 31254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, #msg_alt_dcc 31264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bx 31274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call _printf 31284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima add sp, #4 31294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 31304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bx 31314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ax 31324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, ah 31334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ds 31344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 31354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 31364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 31374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimamsg_alt_dcc: 31384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.ascii "Alternate Display code (%02x) was discarded" 31394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte 0x0d,0x0a,0x00 31404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 31414d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 31424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 31434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 31444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_read_state_info (BX,ES,DI) 31454d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaBit16u BX;Bit16u ES;Bit16u DI; 31464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 31474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Address of static functionality table 31484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ES,DI+0x00,&static_functionality); 31494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ES,DI+0x02,0xC000); 31504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 31514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Hard coded copy from BIOS area. Should it be cleaner ? 31524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima memcpyb(ES,DI+0x04,BIOSMEM_SEG,0x49,30); 31534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima memcpyb(ES,DI+0x22,BIOSMEM_SEG,0x84,3); 31544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 31554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES,DI+0x25,read_byte(BIOSMEM_SEG,BIOSMEM_DCC_INDEX)); 31564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES,DI+0x26,0); 31574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES,DI+0x27,16); 31584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES,DI+0x28,0); 31594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES,DI+0x29,8); 31604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES,DI+0x2a,2); 31614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES,DI+0x2b,0); 31624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES,DI+0x2c,0); 31634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES,DI+0x31,3); 31644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES,DI+0x32,0); 31654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 31664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima memsetb(ES,DI+0x33,0,13); 31674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 31684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 31694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 31704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 31714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic Bit16u biosfn_read_video_state_size2 (CX) 31724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u CX; 31734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 31744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u size; 31754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima size = 0; 31764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (CX & 1) { 31774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima size += 0x46; 31784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 31794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (CX & 2) { 31804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima size += (5 + 8 + 5) * 2 + 6; 31814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 31824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (CX & 4) { 31834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima size += 3 + 256 * 3 + 1; 31844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 31854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima return size; 31864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 31874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 31884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void biosfn_read_video_state_size (CX, BX) 31894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u CX; Bit16u *BX; 31904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 31914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u ss=get_SS(); 31924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ss, BX, biosfn_read_video_state_size2(CX)); 31934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 31944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 31954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic Bit16u biosfn_save_video_state (CX,ES,BX) 31964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u CX;Bit16u ES;Bit16u BX; 31974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 31984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u i, v, crtc_addr, ar_index; 31994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 32004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima crtc_addr = read_word(BIOSMEM_SEG, BIOSMEM_CRTC_ADDRESS); 32014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (CX & 1) { 32024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES, BX, inb(VGAREG_SEQU_ADDRESS)); BX++; 32034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES, BX, inb(crtc_addr)); BX++; 32044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES, BX, inb(VGAREG_GRDC_ADDRESS)); BX++; 32054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima inb(VGAREG_ACTL_RESET); 32064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ar_index = inb(VGAREG_ACTL_ADDRESS); 32074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES, BX, ar_index); BX++; 32084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES, BX, inb(VGAREG_READ_FEATURE_CTL)); BX++; 32094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 32104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(i=1;i<=4;i++){ 32114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_SEQU_ADDRESS, i); 32124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES, BX, inb(VGAREG_SEQU_DATA)); BX++; 32134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 32144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_SEQU_ADDRESS, 0); 32154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES, BX, inb(VGAREG_SEQU_DATA)); BX++; 32164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 32174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(i=0;i<=0x18;i++) { 32184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(crtc_addr,i); 32194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES, BX, inb(crtc_addr+1)); BX++; 32204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 32214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 32224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(i=0;i<=0x13;i++) { 32234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima inb(VGAREG_ACTL_RESET); 32244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_ACTL_ADDRESS, i | (ar_index & 0x20)); 32254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES, BX, inb(VGAREG_ACTL_READ_DATA)); BX++; 32264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 32274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima inb(VGAREG_ACTL_RESET); 32284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 32294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(i=0;i<=8;i++) { 32304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_GRDC_ADDRESS,i); 32314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES, BX, inb(VGAREG_GRDC_DATA)); BX++; 32324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 32334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 32344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ES, BX, crtc_addr); BX+= 2; 32354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 32364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima /* XXX: read plane latches */ 32374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES, BX, 0); BX++; 32384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES, BX, 0); BX++; 32394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES, BX, 0); BX++; 32404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES, BX, 0); BX++; 32414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 32424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (CX & 2) { 32434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES, BX, read_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_MODE)); BX++; 32444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ES, BX, read_word(BIOSMEM_SEG,BIOSMEM_NB_COLS)); BX += 2; 32454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ES, BX, read_word(BIOSMEM_SEG,BIOSMEM_PAGE_SIZE)); BX += 2; 32464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ES, BX, read_word(BIOSMEM_SEG,BIOSMEM_CRTC_ADDRESS)); BX += 2; 32474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES, BX, read_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS)); BX++; 32484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ES, BX, read_word(BIOSMEM_SEG,BIOSMEM_CHAR_HEIGHT)); BX += 2; 32494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES, BX, read_byte(BIOSMEM_SEG,BIOSMEM_VIDEO_CTL)); BX++; 32504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES, BX, read_byte(BIOSMEM_SEG,BIOSMEM_SWITCHES)); BX++; 32514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES, BX, read_byte(BIOSMEM_SEG,BIOSMEM_MODESET_CTL)); BX++; 32524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ES, BX, read_word(BIOSMEM_SEG,BIOSMEM_CURSOR_TYPE)); BX += 2; 32534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(i=0;i<8;i++) { 32544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ES, BX, read_word(BIOSMEM_SEG, BIOSMEM_CURSOR_POS+2*i)); 32554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima BX += 2; 32564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 32574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ES, BX, read_word(BIOSMEM_SEG,BIOSMEM_CURRENT_START)); BX += 2; 32584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES, BX, read_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_PAGE)); BX++; 32594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima /* current font */ 32604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ES, BX, read_word(0, 0x1f * 4)); BX += 2; 32614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ES, BX, read_word(0, 0x1f * 4 + 2)); BX += 2; 32624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ES, BX, read_word(0, 0x43 * 4)); BX += 2; 32634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(ES, BX, read_word(0, 0x43 * 4 + 2)); BX += 2; 32644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 32654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (CX & 4) { 32664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima /* XXX: check this */ 32674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES, BX, inb(VGAREG_DAC_STATE)); BX++; /* read/write mode dac */ 32684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES, BX, inb(VGAREG_DAC_WRITE_ADDRESS)); BX++; /* pix address */ 32694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES, BX, inb(VGAREG_PEL_MASK)); BX++; 32704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Set the whole dac always, from 0 32714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_DAC_WRITE_ADDRESS,0x00); 32724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(i=0;i<256*3;i++) { 32734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES, BX, inb(VGAREG_DAC_DATA)); BX++; 32744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 32754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(ES, BX, 0); BX++; /* color select register */ 32764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 32774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima return BX; 32784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 32794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 32804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic Bit16u biosfn_restore_video_state (CX,ES,BX) 32814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u CX;Bit16u ES;Bit16u BX; 32824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 32834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u i, crtc_addr, v, addr1, ar_index; 32844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 32854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (CX & 1) { 32864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Reset Attribute Ctl flip-flop 32874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima inb(VGAREG_ACTL_RESET); 32884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 32894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima crtc_addr = read_word(ES, BX + 0x40); 32904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima addr1 = BX; 32914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima BX += 5; 32924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 32934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(i=1;i<=4;i++){ 32944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_SEQU_ADDRESS, i); 32954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_SEQU_DATA, read_byte(ES, BX)); BX++; 32964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 32974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_SEQU_ADDRESS, 0); 32984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_SEQU_DATA, read_byte(ES, BX)); BX++; 32994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 33004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Disable CRTC write protection 33014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outw(crtc_addr,0x0011); 33024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Set CRTC regs 33034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(i=0;i<=0x18;i++) { 33044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (i != 0x11) { 33054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(crtc_addr,i); 33064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(crtc_addr+1, read_byte(ES, BX)); 33074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 33084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima BX++; 33094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 33104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // select crtc base address 33114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima v = inb(VGAREG_READ_MISC_OUTPUT) & ~0x01; 33124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (crtc_addr = 0x3d4) 33134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima v |= 0x01; 33144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_WRITE_MISC_OUTPUT, v); 33154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 33164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // enable write protection if needed 33174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(crtc_addr, 0x11); 33184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(crtc_addr+1, read_byte(ES, BX - 0x18 + 0x11)); 33194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 33204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Set Attribute Ctl 33214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ar_index = read_byte(ES, addr1 + 0x03); 33224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima inb(VGAREG_ACTL_RESET); 33234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(i=0;i<=0x13;i++) { 33244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_ACTL_ADDRESS, i | (ar_index & 0x20)); 33254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_ACTL_WRITE_DATA, read_byte(ES, BX)); BX++; 33264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 33274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_ACTL_ADDRESS, ar_index); 33284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima inb(VGAREG_ACTL_RESET); 33294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 33304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(i=0;i<=8;i++) { 33314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_GRDC_ADDRESS,i); 33324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_GRDC_DATA, read_byte(ES, BX)); BX++; 33334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 33344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima BX += 2; /* crtc_addr */ 33354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima BX += 4; /* plane latches */ 33364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 33374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_SEQU_ADDRESS, read_byte(ES, addr1)); addr1++; 33384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(crtc_addr, read_byte(ES, addr1)); addr1++; 33394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_GRDC_ADDRESS, read_byte(ES, addr1)); addr1++; 33404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima addr1++; 33414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(crtc_addr - 0x4 + 0xa, read_byte(ES, addr1)); addr1++; 33424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 33434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (CX & 2) { 33444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_MODE, read_byte(ES, BX)); BX++; 33454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(BIOSMEM_SEG,BIOSMEM_NB_COLS, read_word(ES, BX)); BX += 2; 33464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(BIOSMEM_SEG,BIOSMEM_PAGE_SIZE, read_word(ES, BX)); BX += 2; 33474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(BIOSMEM_SEG,BIOSMEM_CRTC_ADDRESS, read_word(ES, BX)); BX += 2; 33484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, read_byte(ES, BX)); BX++; 33494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(BIOSMEM_SEG,BIOSMEM_CHAR_HEIGHT, read_word(ES, BX)); BX += 2; 33504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(BIOSMEM_SEG,BIOSMEM_VIDEO_CTL, read_byte(ES, BX)); BX++; 33514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(BIOSMEM_SEG,BIOSMEM_SWITCHES, read_byte(ES, BX)); BX++; 33524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(BIOSMEM_SEG,BIOSMEM_MODESET_CTL, read_byte(ES, BX)); BX++; 33534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(BIOSMEM_SEG,BIOSMEM_CURSOR_TYPE, read_word(ES, BX)); BX += 2; 33544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(i=0;i<8;i++) { 33554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(BIOSMEM_SEG, BIOSMEM_CURSOR_POS+2*i, read_word(ES, BX)); 33564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima BX += 2; 33574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 33584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(BIOSMEM_SEG,BIOSMEM_CURRENT_START, read_word(ES, BX)); BX += 2; 33594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_PAGE, read_byte(ES, BX)); BX++; 33604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima /* current font */ 33614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(0, 0x1f * 4, read_word(ES, BX)); BX += 2; 33624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(0, 0x1f * 4 + 2, read_word(ES, BX)); BX += 2; 33634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(0, 0x43 * 4, read_word(ES, BX)); BX += 2; 33644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima write_word(0, 0x43 * 4 + 2, read_word(ES, BX)); BX += 2; 33654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 33664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (CX & 4) { 33674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima BX++; 33684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima v = read_byte(ES, BX); BX++; 33694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_PEL_MASK, read_byte(ES, BX)); BX++; 33704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // Set the whole dac always, from 0 33714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_DAC_WRITE_ADDRESS,0x00); 33724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(i=0;i<256*3;i++) { 33734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_DAC_DATA, read_byte(ES, BX)); BX++; 33744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 33754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima BX++; 33764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(VGAREG_DAC_WRITE_ADDRESS, v); 33774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 33784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima return BX; 33794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 33804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 33814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// ============================================================================================ 33824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// 33834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// Video Utils 33844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// 33854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// ============================================================================================ 33864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 33874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 33884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic Bit8u find_vga_entry(mode) 33894d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaBit8u mode; 33904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 33914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit8u i,line=0xFF; 33924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for(i=0;i<=MODE_MAX;i++) 33934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if(vga_modes[i].svgamode==mode) 33944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima {line=i; 33954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima break; 33964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 33974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima return line; 33984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 33994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 34004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima/* =========================================================== */ 34014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima/* 34024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * Misc Utils 34034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima*/ 34044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima/* =========================================================== */ 34054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 34064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 34074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void memsetb(seg,offset,value,count) 34084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u seg; 34094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u offset; 34104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u value; 34114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u count; 34124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 34134d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 34144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bp 34154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bp, sp 34164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 34174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 34184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push cx 34194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push es 34204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push di 34214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 34224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov cx, 10[bp] ; count 34234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp cx, #0x00 34244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima je memsetb_end 34254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, 4[bp] ; segment 34264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov es, ax 34274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, 6[bp] ; offset 34284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov di, ax 34294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, 8[bp] ; value 34304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cld 34314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima rep 34324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima stosb 34334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 34344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimamemsetb_end: 34354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop di 34364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop es 34374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop cx 34384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ax 34394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 34404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bp 34414d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 34424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 34434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 34444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 34454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void memsetw(seg,offset,value,count) 34464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u seg; 34474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u offset; 34484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u value; 34494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u count; 34504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 34514d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 34524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bp 34534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bp, sp 34544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 34554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 34564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push cx 34574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push es 34584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push di 34594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 34604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov cx, 10[bp] ; count 34614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp cx, #0x00 34624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima je memsetw_end 34634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, 4[bp] ; segment 34644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov es, ax 34654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, 6[bp] ; offset 34664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov di, ax 34674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, 8[bp] ; value 34684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cld 34694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima rep 34704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima stosw 34714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 34724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimamemsetw_end: 34734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop di 34744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop es 34754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop cx 34764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ax 34774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 34784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bp 34794d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 34804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 34814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 34824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 34834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void memcpyb(dseg,doffset,sseg,soffset,count) 34844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u dseg; 34854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u doffset; 34864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u sseg; 34874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u soffset; 34884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u count; 34894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 34904d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 34914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bp 34924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bp, sp 34934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 34944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 34954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push cx 34964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push es 34974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push di 34984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ds 34994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push si 35004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 35014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov cx, 12[bp] ; count 35024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp cx, #0x0000 35034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima je memcpyb_end 35044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, 4[bp] ; dsegment 35054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov es, ax 35064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, 6[bp] ; doffset 35074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov di, ax 35084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, 8[bp] ; ssegment 35094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ds, ax 35104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, 10[bp] ; soffset 35114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov si, ax 35124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cld 35134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima rep 35144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima movsb 35154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 35164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimamemcpyb_end: 35174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop si 35184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ds 35194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop di 35204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop es 35214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop cx 35224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ax 35234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 35244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bp 35254d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 35264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 35274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 35284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 35294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void memcpyw(dseg,doffset,sseg,soffset,count) 35304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u dseg; 35314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u doffset; 35324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u sseg; 35334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u soffset; 35344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u count; 35354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 35364d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 35374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bp 35384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bp, sp 35394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 35404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 35414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push cx 35424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push es 35434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push di 35444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ds 35454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push si 35464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 35474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov cx, 12[bp] ; count 35484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp cx, #0x0000 35494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima je memcpyw_end 35504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, 4[bp] ; dsegment 35514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov es, ax 35524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, 6[bp] ; doffset 35534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov di, ax 35544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, 8[bp] ; ssegment 35554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ds, ax 35564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, 10[bp] ; soffset 35574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov si, ax 35584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cld 35594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima rep 35604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima movsw 35614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 35624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimamemcpyw_end: 35634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop si 35644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ds 35654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop di 35664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop es 35674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop cx 35684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ax 35694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 35704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bp 35714d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 35724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 35734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 35744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima/* =========================================================== */ 35754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima/* 35764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima * These functions where ripped from Kevin's rombios.c 35774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima*/ 35784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima/* =========================================================== */ 35794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 35804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 35814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic Bit8u 35824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaread_byte(seg, offset) 35834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u seg; 35844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u offset; 35854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 35864d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 35874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bp 35884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bp, sp 35894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 35904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bx 35914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ds 35924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, 4[bp] ; segment 35934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ds, ax 35944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, 6[bp] ; offset 35954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, [bx] 35964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ;; al = return value (byte) 35974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ds 35984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bx 35994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 36004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bp 36014d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 36024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 36034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 36044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 36054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic Bit16u 36064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaread_word(seg, offset) 36074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u seg; 36084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u offset; 36094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 36104d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 36114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bp 36124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bp, sp 36134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 36144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bx 36154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ds 36164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, 4[bp] ; segment 36174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ds, ax 36184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, 6[bp] ; offset 36194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, [bx] 36204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ;; ax = return value (word) 36214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ds 36224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bx 36234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 36244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bp 36254d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 36264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 36274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 36284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 36294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void 36304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimawrite_byte(seg, offset, data) 36314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u seg; 36324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u offset; 36334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit8u data; 36344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 36354d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 36364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bp 36374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bp, sp 36384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 36394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 36404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bx 36414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ds 36424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, 4[bp] ; segment 36434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ds, ax 36444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, 6[bp] ; offset 36454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, 8[bp] ; data byte 36464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov [bx], al ; write data byte 36474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ds 36484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bx 36494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ax 36504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 36514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bp 36524d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 36534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 36544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 36554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 36564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimastatic void 36574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimawrite_word(seg, offset, data) 36584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u seg; 36594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u offset; 36604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u data; 36614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 36624d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 36634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bp 36644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bp, sp 36654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 36664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 36674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bx 36684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ds 36694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, 4[bp] ; segment 36704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ds, ax 36714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, 6[bp] ; offset 36724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, 8[bp] ; data word 36734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov [bx], ax ; write data word 36744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ds 36754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bx 36764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ax 36774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 36784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bp 36794d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 36804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 36814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 36824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 36834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit8u 36844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimainb(port) 36854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u port; 36864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 36874d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 36884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bp 36894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bp, sp 36904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 36914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push dx 36924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, 4[bp] 36934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in al, dx 36944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop dx 36954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 36964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bp 36974d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 36984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 36994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 37004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u 37014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimainw(port) 37024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u port; 37034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 37044d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 37054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bp 37064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bp, sp 37074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 37084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push dx 37094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, 4[bp] 37104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in ax, dx 37114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop dx 37124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 37134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bp 37144d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 37154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 37164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 37174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 37184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima void 37194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaoutb(port, val) 37204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u port; 37214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit8u val; 37224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 37234d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 37244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bp 37254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bp, sp 37264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 37274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 37284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push dx 37294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, 4[bp] 37304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, 6[bp] 37314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, al 37324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop dx 37334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ax 37344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 37354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bp 37364d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 37374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 37384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 37394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 37404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima void 37414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimaoutw(port, val) 37424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u port; 37434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u val; 37444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 37454d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 37464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bp 37474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bp, sp 37484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 37494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push ax 37504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push dx 37514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, 4[bp] 37524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, 6[bp] 37534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, ax 37544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop dx 37554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop ax 37564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 37574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bp 37584d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 37594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 37604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 37614d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaBit16u get_SS() 37624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 37634d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 37644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, ss 37654d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 37664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 37674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 37684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef DEBUG 37694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavoid unimplemented() 37704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 37714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima printf("--> Unimplemented\n"); 37724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 37734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 37744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavoid unknown() 37754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 37764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima printf("--> Unknown int10\n"); 37774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 37784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 37794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 37804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 37814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#if defined(USE_BX_INFO) || defined(DEBUG) || defined(CIRRUS_DEBUG) 37824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavoid printf(s) 37834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit8u *s; 37844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima{ 37854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit8u c, format_char; 37864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Boolean in_format; 37874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima unsigned format_width, i; 37884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u *arg_ptr; 37894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima Bit16u arg_seg, arg, digit, nibble, shift_count; 37904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 37914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima arg_ptr = &s; 37924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima arg_seg = get_SS(); 37934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 37944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in_format = 0; 37954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima format_width = 0; 37964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 37974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima while (c = read_byte(0xc000, s)) { 37984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if ( c == '%' ) { 37994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in_format = 1; 38004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima format_width = 0; 38014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 38024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else if (in_format) { 38034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if ( (c>='0') && (c<='9') ) { 38044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima format_width = (format_width * 10) + (c - '0'); 38054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 38064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else if (c == 'x') { 38074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima arg_ptr++; // increment to next arg 38084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima arg = read_word(arg_seg, arg_ptr); 38094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (format_width == 0) 38104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima format_width = 4; 38114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima i = 0; 38124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima digit = format_width - 1; 38134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima for (i=0; i<format_width; i++) { 38144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima nibble = (arg >> (4 * digit)) & 0x000f; 38154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima if (nibble <= 9) 38164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(0x0500, nibble + '0'); 38174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else 38184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(0x0500, (nibble - 10) + 'A'); 38194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima digit--; 38204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 38214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in_format = 0; 38224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 38234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima //else if (c == 'd') { 38244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // in_format = 0; 38254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima // } 38264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 38274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima else { 38284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb(0x0500, c); 38294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 38304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima s ++; 38314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima } 38324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima} 38334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 38344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 38354d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 38364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ; get LFB address from PCI 38374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ; in - ax: PCI device vendor 38384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ; out - ax: LFB address (high 16 bit) 38394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ;; NOTE - may be called in protected mode 38404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima_pci_get_lfb_addr: 38414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push bx 38424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push cx 38434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push dx 38444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima push eax 38454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov bx, ax 38464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima xor cx, cx 38474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dl, #0x00 38484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call pci_read_reg 38494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp ax, #0xffff 38504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jz pci_get_lfb_addr_5 38514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pci_get_lfb_addr_3: 38524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dl, #0x00 38534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call pci_read_reg 38544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp ax, bx ;; check vendor 38554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jz pci_get_lfb_addr_4 38564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima add cx, #0x8 38574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp cx, #0x200 ;; search bus #0 and #1 38584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jb pci_get_lfb_addr_3 38594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pci_get_lfb_addr_5: 38604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima xor dx, dx ;; no LFB 38614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp pci_get_lfb_addr_6 38624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pci_get_lfb_addr_4: 38634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dl, #0x10 ;; I/O space #0 38644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima call pci_read_reg 38654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima test ax, #0xfff1 38664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jnz pci_get_lfb_addr_5 38674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima shr eax, #16 38684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, ax ;; LFB address 38694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pci_get_lfb_addr_6: 38704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop eax 38714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, dx 38724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop dx 38734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop cx 38744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima pop bx 38754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 38764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 38774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ; read PCI register 38784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ; in - cx: device/function 38794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ; in - dl: register 38804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ; out - eax: value 38814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimapci_read_reg: 38824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov eax, #0x00800000 38834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov ax, cx 38844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima shl eax, #8 38854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov al, dl 38864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov dx, #0xcf8 38874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima out dx, eax 38884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima add dl, #4 38894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima in eax, dx 38904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima ret 38914d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 38924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 38934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef VBE 38944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#include "vbe.c" 38954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 38964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 38974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#ifdef CIRRUS 38984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#include "clext.c" 38994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#endif 39004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 39014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// -------------------------------------------------------------------------------------------- 39024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 39034d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 39044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;; DATA_SEG_DEFS_HERE 39054d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 39064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 39074d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_START 39084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.ascii "vgabios ends here" 39094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte 0x00 39104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimavgabios_end: 39114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.byte 0xCB 39124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima;; BLOCK_STRINGS_BEGIN 39134d07f569799aaae0d7fccf8e76386d450664987fJun NakajimaASM_END 3914