]> 4ch.mooo.com Git - 16.git/blob - 16/tauron/C_SRC/DUAL.CPP
e60d1fb98af36ac3a56d15c7c164d56f66cfb2ab
[16.git] / 16 / tauron / C_SRC / DUAL.CPP
1 //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
2 //=-                                                                         -=\r
3 //=-                   Tauron VGA Utilities Version 3.0                      -=\r
4 //=-                      Released September 20, 1998                        -=\r
5 //=-                                                                         -=\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
17 // 3C4H, 03H\r
18 // Bit positions for font maps:\r
19 //\r
20 // +--7--+--6--+--5--+--4--+--3--+--2--+--1--+--0--+\r
21 // |     |     | SAH | SBH |    SA     |    SB     |\r
22 // +-----+-----+-----+-----+-----+-----+-----+-----+\r
23 //\r
24 // SA  - bits 1, 0 of Character Map A\r
25 // SAH - bit 2 (high order) of Charcter Map A\r
26 //\r
27 // SB  - bits 1, 0 of Character Map B\r
28 // SBH - bit 2 (high order) of Charcter Map B\r
29 //\r
30 #include <string.h>\r
31 #include <stdlib.h>\r
32 #include <stdio.h>\r
33 #include <conio.h>\r
34 #include <dos.h>\r
35 #include "tauron.h"\r
36 #include "font1.h"\r
37 #include "font2.h"\r
38 extern unsigned char mode03h[62];\r
39 void LoadFonts();\r
40 \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
50 \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
60 \r
61 \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
65 //\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
69 //\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
72 //\r
73 // This procedure sets up dual font mode and loads 2 fonts into video memory.\r
74 void SetDual()\r
75 {\r
76    outport(SEQ_ADDR, ((DFM_MAPA_FONT1 | DFM_MAPB_FONT5) << 8) | 0x03);\r
77 \r
78    // Load font 1 into 0K and font 2 into 8K\r
79         LoadFonts();\r
80 }\r
81 \r
82 // This procedure reset the character map select register to point to only\r
83 // one font.\r
84 void UnSetDual()\r
85 {\r
86    outport(0x3C4,0x0003);\r
87 }\r
88 \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
91 // font.\r
92 //\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
95 //\r
96 void SetDualPalette()\r
97 {\r
98         // Font 1\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
107    // Font 2\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
116 }\r
117 \r
118 void pchar(int x, int y, char c, char att)\r
119 {\r
120    char far *vidmem;\r
121    int off;\r
122 \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
126    vidmem += off;\r
127    *vidmem++ = c;\r
128    *vidmem = att;\r
129 }\r
130 \r
131 void print(int x, int y, char *Text, char attrib)\r
132 {\r
133         for (int i = 0; i < strlen(Text); i++)\r
134         pchar(x++,y,Text[i],attrib);\r
135 }\r
136 \r
137 void DualTest()\r
138 {\r
139         SetMode((unsigned int)&mode03h);\r
140    TextClear(0x1F);\r
141    SetDual();\r
142    SetDualPalette();\r
143 \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
146     */\r
147 \r
148         print(0,0,"ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿",0x17);\r
149    print(0,1,"³ DUAL FONT MODE ³",0x17);\r
150    print(0,2,"ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ",0x17);\r
151 \r
152         print(0,4,"ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿",0x1F);\r
153    print(0,5,"³ DUAL FONT MODE ³",0x1F);\r
154    print(0,6,"ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ",0x1F);\r
155 \r
156    getch();\r
157    UnSetDual();\r
158    textcolor(7);\r
159    textbackground(0);\r
160 }\r
161 \r
162 \r
163 void LoadFonts()\r
164 {\r
165    char far *vidmem;\r
166    int l = 0;\r
167    unsigned char oldmode,oldmisc,oldmem,oldmask;\r
168    unsigned char newmode,newmisc,newmem;\r
169 \r
170    // Make a pointer to the font\r
171    vidmem = (char far *)MK_FP( 0xA000, 0x0000);\r
172 \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
185 \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
197 \r
198    // Copy the font from BIOS\r
199    l = 0;\r
200    for (int i = 0; i < 256; i++)\r
201    {\r
202       for (int j = 0; j < 16; j++)\r
203       {\r
204          *vidmem++ = Font1[l++];\r
205       }\r
206       for (int k = 0; k < 16; k++)\r
207       {\r
208          *vidmem++ = 0x00;\r
209       }\r
210    }\r
211 \r
212    vidmem = (char far *)MK_FP( 0xA000, 0x2000);\r
213    l = 0;\r
214    for (int i = 0; i < 256; i++)\r
215    {\r
216       for (int j = 0; j < 16; j++)\r
217       {\r
218          *vidmem++ = Font2[l++];\r
219       }\r
220       for (int k = 0; k < 16; k++)\r
221       {\r
222          *vidmem++ = 0x00;\r
223       }\r
224    }\r
225 \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
234 }\r
235 \r
236 //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=