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