149 lines
3.7 KiB
C
149 lines
3.7 KiB
C
/*
|
|
* $Id$
|
|
* $Source$
|
|
*
|
|
* by
|
|
* Steve M. Gehlbach <steve@kesa.com>
|
|
*
|
|
* These routines set graphics mode and alpha mode
|
|
* for switching back and forth.
|
|
*
|
|
* Register settings are
|
|
* more or less as follows:
|
|
*
|
|
* Register Graphics Alpha
|
|
* 16 color
|
|
* ------------------------------------------------
|
|
* GDC_MODE 0x00 0x10
|
|
* GDC_MISC 0x05 0x0e
|
|
* SEQ_MEMORY_MODE 0x06 0x02
|
|
* SEQ_PLANE_WRITE 0x0f 0x03
|
|
* CRTC_CURSOR_START 0x20 0x00
|
|
* CRTC_CURSOR_END 0x00 CHAR_HEIGHT-1
|
|
* CRTC_MODE 0xe3 0xa3
|
|
* CRTC_MAX_SCAN 0x40 0x40 | CHAR_HEIGHT-1
|
|
* ATC_MODE 0x01 0x0c
|
|
*
|
|
*/
|
|
|
|
#include "asm/io.h"
|
|
#include "vga.h"
|
|
|
|
void vga_set_gmode (void) {
|
|
u8 byte;
|
|
|
|
byte = read_att_b(ATC_MODE) & ~0x0f;
|
|
write_att(byte|0x1, ATC_MODE);
|
|
//
|
|
// display is off at this point
|
|
|
|
byte = read_seq_b(SEQ_PLANE_WRITE) & ~0xf;
|
|
write_seq(byte|0xf,SEQ_PLANE_WRITE); // all planes
|
|
byte = read_seq_b(SEQ_MEMORY_MODE);
|
|
write_seq(byte|4,SEQ_MEMORY_MODE);
|
|
|
|
byte = read_gra_b(GDC_MODE) & ~0x10;
|
|
write_gra(byte,GDC_MODE);
|
|
write_gra(0x05, GDC_MISC);
|
|
|
|
write_crtc(0x20, CRTC_CURSOR_START);
|
|
write_crtc(0x00, CRTC_CURSOR_END);
|
|
byte = read_crtc_b(CRTC_MODE) & ~0xe0;
|
|
write_crtc(byte|0xe0, CRTC_MODE);
|
|
byte = read_crtc_b(CRTC_MAX_SCAN) & ~0x01f;
|
|
write_crtc(byte, CRTC_MAX_SCAN);
|
|
|
|
byte = inb(MIS_R); // get 3c2 value by reading 3cc
|
|
outb(byte & ~0xc,MIS_W); // clear last bits to set 25Mhz clock and low page
|
|
|
|
|
|
// turn on display, disable access to attr palette
|
|
inb(IS1_RC);
|
|
outb(0x20, ATT_IW);
|
|
}
|
|
|
|
void vga_set_amode (void) {
|
|
u8 byte;
|
|
write_att(0x0c, ATC_MODE);
|
|
|
|
//reset palette to normal in the case it was changed
|
|
write_att(0x0, ATC_COLOR_PAGE);
|
|
//
|
|
// display is off at this point
|
|
|
|
write_seq(0x3,SEQ_PLANE_WRITE); // planes 0 & 1
|
|
byte = read_seq_b(SEQ_MEMORY_MODE) & ~0x04;
|
|
write_seq(byte,SEQ_MEMORY_MODE);
|
|
|
|
byte = read_gra_b(GDC_MODE) & ~0x60;
|
|
write_gra(byte|0x10,GDC_MODE);
|
|
|
|
write_gra(0x0e, GDC_MISC);
|
|
|
|
write_crtc(0x00, CRTC_CURSOR_START);
|
|
write_crtc(CHAR_HEIGHT-1, CRTC_CURSOR_END);
|
|
|
|
byte = read_crtc_b(CRTC_MODE) & ~0xe0;
|
|
write_crtc(byte|0xa0, CRTC_MODE);
|
|
byte = read_crtc_b(CRTC_MAX_SCAN) & ~0x01f;
|
|
write_crtc(byte | (CHAR_HEIGHT-1), CRTC_MAX_SCAN);
|
|
|
|
|
|
// turn on display, disable access to attr palette
|
|
inb(IS1_RC);
|
|
outb(0x20, ATT_IW);
|
|
}
|
|
|
|
/*
|
|
* by Steve M. Gehlbach, Ph.D. <steve@kesa.com>
|
|
*
|
|
* vga_font_load loads a font into font memory. It
|
|
* assumes alpha mode has been set.
|
|
*
|
|
* The font load code follows technique used
|
|
* in the tiara project, which came from
|
|
* the Universal Talkware Boot Loader,
|
|
* http://www.talkware.net.
|
|
*/
|
|
|
|
void vga_font_load(unsigned char *vidmem, const unsigned char *font, int height, int num_chars) {
|
|
|
|
/* Note: the font table is 'height' long but the font storage area
|
|
* is 32 bytes long.
|
|
*/
|
|
|
|
int i,j;
|
|
u8 byte;
|
|
|
|
// set sequencer map 2, odd/even off
|
|
byte = read_seq_b(SEQ_PLANE_WRITE) & ~0xf;
|
|
write_seq(byte|4,SEQ_PLANE_WRITE);
|
|
byte = read_seq_b(SEQ_MEMORY_MODE);
|
|
write_seq(byte|4,SEQ_MEMORY_MODE);
|
|
|
|
// select graphics map 2, odd/even off, map starts at 0xa0000
|
|
write_gra(2,GDC_PLANE_READ);
|
|
byte = read_gra_b(GDC_MODE) & ~0x10;
|
|
write_gra(byte,GDC_MODE);
|
|
write_gra(0,GDC_MISC);
|
|
|
|
for (i = 0 ; i < num_chars ; i++) {
|
|
for (j = 0 ; j < height ; j++) {
|
|
vidmem[i*32+j] = font[i*16+j];
|
|
}
|
|
}
|
|
|
|
// set sequencer back to maps 0,1, odd/even on
|
|
byte = read_seq_b(SEQ_PLANE_WRITE) & ~0xf;
|
|
write_seq(byte|3,SEQ_PLANE_WRITE);
|
|
byte = read_seq_b(SEQ_MEMORY_MODE) & ~0x4;
|
|
write_seq(byte,SEQ_MEMORY_MODE);
|
|
|
|
// select graphics back to map 0,1, odd/even on
|
|
write_gra(0,GDC_PLANE_READ);
|
|
byte = read_gra_b(GDC_MODE);
|
|
write_gra(byte|0x10,GDC_MODE);
|
|
write_gra(0xe,GDC_MISC);
|
|
|
|
}
|