1 //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
3 //=- Tauron VGA Utilities Version 3.0 -=
\r
4 //=- Released September 20, 1998 -=
\r
6 //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
7 //=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -=
\r
8 //=- All Rights Reserved. =-= that you put my name some- -=
\r
9 //=- =-= where in your credits. -=
\r
10 //=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
11 //=- I assume no responsibility whatsoever for any effect that this package, -=
\r
12 //=- the information contained therein or the use thereof has on you, your -=
\r
13 //=- sanity, computer, spouse, children, pets or anything else related to -=
\r
14 //=- you or your existance. No warranty is provided nor implied with this -=
\r
15 //=- source code. -=
\r
16 //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
18 // Bit positions for font maps:
\r
20 // +--7--+--6--+--5--+--4--+--3--+--2--+--1--+--0--+
\r
21 // | | | SAH | SBH | SA | SB |
\r
22 // +-----+-----+-----+-----+-----+-----+-----+-----+
\r
24 // SA - bits 1, 0 of Character Map A
\r
25 // SAH - bit 2 (high order) of Charcter Map A
\r
27 // SB - bits 1, 0 of Character Map B
\r
28 // SBH - bit 2 (high order) of Charcter Map B
\r
38 extern unsigned char mode03h[62];
\r
41 // Points to fonts for Map A Memory Address
\r
42 #define DFM_MAPA_FONT1 0x00 // 0K
\r
43 #define DFM_MAPA_FONT2 0x04 // 16K
\r
44 #define DFM_MAPA_FONT3 0x08 // 32K
\r
45 #define DFM_MAPA_FONT4 0x0C // 48K
\r
46 #define DFM_MAPA_FONT5 0x20 // 8K
\r
47 #define DFM_MAPA_FONT6 0x24 // 24K
\r
48 #define DFM_MAPA_FONT7 0x28 // 40K
\r
49 #define DFM_MAPA_FONT8 0x2C // 56K
\r
51 // Points to fonts for Map B
\r
52 #define DFM_MAPB_FONT1 0x00 // 0K
\r
53 #define DFM_MAPB_FONT2 0x01 // 16K
\r
54 #define DFM_MAPB_FONT3 0x02 // 32K
\r
55 #define DFM_MAPB_FONT4 0x03 // 48K
\r
56 #define DFM_MAPB_FONT5 0x10 // 8K
\r
57 #define DFM_MAPB_FONT6 0x11 // 24K
\r
58 #define DFM_MAPB_FONT7 0x12 // 40K
\r
59 #define DFM_MAPB_FONT8 0x13 // 56K
\r
62 // To set dual font mode, just set the character map select register to point
\r
63 // to 2 different fonts. There can be up to 8 fonts resident in memory at
\r
64 // once but only 2 can be active at a time.
\r
66 // ** NOTE ** If you set both font maps the same you are no longer in dual font
\r
67 // mode. But what this allows you to do is to put up to 8 fonts in VGA memory
\r
68 // and switch between them at any time.
\r
70 // Both fonts were made with my font editor. I just read the BIOS and
\r
71 // modified the second font so a solid line goes through the middle of it.
\r
73 // This procedure sets up dual font mode and loads 2 fonts into video memory.
\r
76 outport(SEQ_ADDR, ((DFM_MAPA_FONT1 | DFM_MAPB_FONT5) << 8) | 0x03);
\r
78 // Load font 1 into 0K and font 2 into 8K
\r
82 // This procedure reset the character map select register to point to only
\r
86 outport(0x3C4,0x0003);
\r
89 // In dual font modes, the palette is in effect half of what it is. The
\r
90 // bottom 8 colors for the first font, and the top 8 colors for the second
\r
93 // What I do here is to set them to the same 8 colors.
\r
94 // Black, Blue, Green, Red, Purple, Yellow, Light Gray, and White
\r
96 void SetDualPalette()
\r
99 setpal( 0, 0, 0, 0);
\r
100 setpal( 1, 0, 0, 42);
\r
101 setpal( 2, 0, 42, 0);
\r
102 setpal( 3, 0, 42, 42);
\r
103 setpal( 4, 42, 0, 0);
\r
104 setpal( 5, 63, 63, 21);
\r
105 setpal( 6, 42, 42, 42);
\r
106 setpal( 7, 63, 63, 63);
\r
108 setpal( 8, 0, 0, 0);
\r
109 setpal( 9, 0, 0, 42);
\r
110 setpal(10, 0, 42, 0);
\r
111 setpal(11, 0, 42, 42);
\r
112 setpal(12, 42, 0, 0);
\r
113 setpal(13, 63, 63, 21);
\r
114 setpal(14, 42, 42, 42);
\r
115 setpal(15, 63, 63, 63);
\r
118 void pchar(int x, int y, char c, char att)
\r
123 // Make a pointer to the font
\r
124 vidmem = (char far *)MK_FP( 0xB800, 0x0000);
\r
125 off = y * 160 + x * 2;
\r
131 void print(int x, int y, char *Text, char attrib)
\r
133 for (int i = 0; i < strlen(Text); i++)
\r
134 pchar(x++,y,Text[i],attrib);
\r
139 SetMode((unsigned int)&mode03h);
\r
144 /* ** NOTE ** when trying to print text on the screen, do not use the printf
\r
145 * text functions. For some reason they do not select the proper VGA font.
\r
148 print(0,0,"ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿",0x17);
\r
149 print(0,1,"³ DUAL FONT MODE ³",0x17);
\r
150 print(0,2,"ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ",0x17);
\r
152 print(0,4,"ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿",0x1F);
\r
153 print(0,5,"³ DUAL FONT MODE ³",0x1F);
\r
154 print(0,6,"ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ",0x1F);
\r
167 unsigned char oldmode,oldmisc,oldmem,oldmask;
\r
168 unsigned char newmode,newmisc,newmem;
\r
170 // Make a pointer to the font
\r
171 vidmem = (char far *)MK_FP( 0xA000, 0x0000);
\r
173 // Store the OLD 'Mode Register' value
\r
174 outportb(GRACON_ADDR,5);
\r
175 oldmode = inportb(GRACON_ADDR+1);
\r
176 // Store the OLD 'Miscellaneous Register' value
\r
177 outportb(GRACON_ADDR,6);
\r
178 oldmisc = inportb(GRACON_ADDR+1);
\r
179 // Store the OLD 'Mask Map' value
\r
180 outportb(SEQ_ADDR,2);
\r
181 oldmask = inportb(SEQ_ADDR+1);
\r
182 // Store the OLD 'Memory Mode' value
\r
183 outportb(SEQ_ADDR,4);
\r
184 oldmem = inportb(SEQ_ADDR+1);
\r
186 // Write the NEW 'Mode Register' value
\r
187 newmode = (oldmode & 0xFC);
\r
188 outport(GRACON_ADDR, (newmode << 8) | 0x05);
\r
189 // Write the NEW 'Miscellaneous Register' value
\r
190 newmisc = ((oldmisc & 0xF1)|4);
\r
191 outport(GRACON_ADDR, (newmisc << 8) | 0x06);
\r
192 // Write the NEW 'Mask Map' value
\r
193 outport(SEQ_ADDR, 0x0402);
\r
194 // Write the NEW 'Memory Mode' value
\r
195 newmem = (oldmem | 4);
\r
196 outport(SEQ_ADDR, (newmem << 8) | 0x04);
\r
198 // Copy the font from BIOS
\r
200 for (int i = 0; i < 256; i++)
\r
202 for (int j = 0; j < 16; j++)
\r
204 *vidmem++ = Font1[l++];
\r
206 for (int k = 0; k < 16; k++)
\r
212 vidmem = (char far *)MK_FP( 0xA000, 0x2000);
\r
214 for (int i = 0; i < 256; i++)
\r
216 for (int j = 0; j < 16; j++)
\r
218 *vidmem++ = Font2[l++];
\r
220 for (int k = 0; k < 16; k++)
\r
226 // Write the OLD 'Mode Register' value
\r
227 outport(GRACON_ADDR, (oldmode << 8) | 0x05);
\r
228 // Write the OLD 'Miscellaneous Register' value
\r
229 outport(GRACON_ADDR, (oldmisc << 8) | 0x06);
\r
230 // Write the OLD 'Mask Map' value
\r
231 outport(SEQ_ADDR,(oldmask << 8) | 0x02);
\r
232 // Write the OLD 'Memory Mode' value
\r
233 outport(SEQ_ADDR, (oldmem << 8) | 0x04);
\r
236 //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=