1 | /*
|
---|
2 | This is a little turbo C program that executes
|
---|
3 | several int10, and let you inspect the content
|
---|
4 | of the vgabios area
|
---|
5 |
|
---|
6 | It is used to test the behavior of the vgabios
|
---|
7 | */
|
---|
8 |
|
---|
9 | #include <stdio.h>
|
---|
10 | #include <dos.h>
|
---|
11 | #include <conio.h>
|
---|
12 |
|
---|
13 |
|
---|
14 | typedef unsigned char Bit8u;
|
---|
15 | typedef unsigned short Bit16u;
|
---|
16 |
|
---|
17 | typedef struct
|
---|
18 | {Bit8u initial;
|
---|
19 | Bit8u current;
|
---|
20 | Bit16u nbcols;
|
---|
21 | Bit16u regen;
|
---|
22 | Bit16u start;
|
---|
23 | Bit16u curpos[8];
|
---|
24 | Bit8u curtyp;
|
---|
25 | Bit8u curpage;
|
---|
26 | Bit16u crtc;
|
---|
27 | Bit16u msr;
|
---|
28 | Bit16u cgapal;
|
---|
29 | Bit8u nbrows;
|
---|
30 | Bit16u cheight;
|
---|
31 | Bit8u ctl;
|
---|
32 | Bit8u switches;
|
---|
33 | Bit8u modeset;
|
---|
34 | Bit8u dcc;
|
---|
35 | Bit16u vsseg;
|
---|
36 | Bit16u vsoffset;
|
---|
37 | } BIOSAREA;
|
---|
38 |
|
---|
39 | void int10ax0003(struct REGPACK *regs)
|
---|
40 | {
|
---|
41 | regs->r_ax=0x0003;
|
---|
42 | intr(0x10,regs);
|
---|
43 | }
|
---|
44 |
|
---|
45 | void int10ax02(struct REGPACK *regs)
|
---|
46 | {
|
---|
47 | regs->r_ax=0x0200;
|
---|
48 | regs->r_bx=0x0000;
|
---|
49 | regs->r_dx=0x1710;
|
---|
50 | intr(0x10,regs);
|
---|
51 | printf("We are now at 24/17");
|
---|
52 | }
|
---|
53 |
|
---|
54 | void int10ax03(struct REGPACK *regs)
|
---|
55 | {
|
---|
56 | regs->r_ax=0x0300;
|
---|
57 | regs->r_bx=0x0000;
|
---|
58 | intr(0x10,regs);
|
---|
59 | printf("\nCursor is ax%04x cx%04x dx%04x\n",regs->r_ax,regs->r_cx,regs->r_dx);
|
---|
60 | }
|
---|
61 |
|
---|
62 | void int10ax0501(struct REGPACK *regs)
|
---|
63 | {
|
---|
64 | regs->r_ax=0x0501;
|
---|
65 | intr(0x10,regs);
|
---|
66 | regs->r_ax=0x0e61;
|
---|
67 | regs->r_bx=0x0000;
|
---|
68 | intr(0x10,regs);
|
---|
69 | printf("We are now on page 2");
|
---|
70 | }
|
---|
71 |
|
---|
72 | void int10ax0602(struct REGPACK *regs)
|
---|
73 | {
|
---|
74 | regs->r_ax=0x0602;
|
---|
75 | regs->r_bx=0x0700;
|
---|
76 | regs->r_cx=0x0101;
|
---|
77 | regs->r_dx=0x0a0a;
|
---|
78 | intr(0x10,regs);
|
---|
79 | printf("Scrolled 2 up");
|
---|
80 | }
|
---|
81 |
|
---|
82 | void int10ax0702(struct REGPACK *regs)
|
---|
83 | {
|
---|
84 | regs->r_ax=0x0702;
|
---|
85 | regs->r_bx=0x0700;
|
---|
86 | regs->r_cx=0x0101;
|
---|
87 | regs->r_dx=0x0a0a;
|
---|
88 | intr(0x10,regs);
|
---|
89 | printf("Scrolled 2 down");
|
---|
90 | }
|
---|
91 |
|
---|
92 | void int10ax08(struct REGPACK *regs)
|
---|
93 | {
|
---|
94 | regs->r_ax=0x0800;
|
---|
95 | regs->r_bx=0x0000;
|
---|
96 | intr(0x10,regs);
|
---|
97 | }
|
---|
98 |
|
---|
99 | void int10ax09(struct REGPACK *regs)
|
---|
100 | {
|
---|
101 | char attr;
|
---|
102 | regs->r_ax=0x0501;
|
---|
103 | intr(0x10,regs);
|
---|
104 | for(attr=0;attr<16;attr++)
|
---|
105 | {printf("%02x ",attr);
|
---|
106 | regs->r_ax=0x0961+attr;
|
---|
107 | regs->r_bx=0x0100+attr;
|
---|
108 | regs->r_cx=0x0016;
|
---|
109 | intr(0x10,regs);
|
---|
110 | printf("\n");
|
---|
111 | }
|
---|
112 | }
|
---|
113 |
|
---|
114 | void int10ax0a(struct REGPACK *regs)
|
---|
115 | {
|
---|
116 | regs->r_ax=0x0501;
|
---|
117 | intr(0x10,regs);
|
---|
118 | regs->r_ax=0x0a62;
|
---|
119 | regs->r_bx=0x0101;
|
---|
120 | regs->r_cx=0x0016;
|
---|
121 | intr(0x10,regs);
|
---|
122 | }
|
---|
123 |
|
---|
124 | void int10ax0f(struct REGPACK *regs)
|
---|
125 | {
|
---|
126 | regs->r_ax=0x0501;
|
---|
127 | intr(0x10,regs);
|
---|
128 | regs->r_ax=0x0f00;
|
---|
129 | intr(0x10,regs);
|
---|
130 | }
|
---|
131 |
|
---|
132 | void int10ax1b(struct REGPACK *regs)
|
---|
133 | {unsigned char table[64];
|
---|
134 | unsigned char far *ptable;
|
---|
135 | int i;
|
---|
136 |
|
---|
137 | regs->r_ax=0x0501;
|
---|
138 | intr(0x10,regs);
|
---|
139 | regs->r_ax=0x1b00;
|
---|
140 | regs->r_bx=0x0000;
|
---|
141 | ptable=&table;
|
---|
142 | regs->r_es=FP_SEG(ptable);
|
---|
143 | regs->r_di=FP_OFF(ptable);
|
---|
144 | printf("Read state info in %04x:%04x\n",regs->r_es,regs->r_di);
|
---|
145 | intr(0x10,regs);
|
---|
146 |
|
---|
147 | for(i=0;i<64;i++)
|
---|
148 | {if(i%16==0)printf("\n%02x ",i);
|
---|
149 | printf("%02x ",table[i]);
|
---|
150 | }
|
---|
151 | printf("\n");
|
---|
152 | }
|
---|
153 |
|
---|
154 | static unsigned char var[64];
|
---|
155 |
|
---|
156 | void int10ax13(struct REGPACK *regs)
|
---|
157 | {unsigned char far *pvar;
|
---|
158 |
|
---|
159 | pvar=&var;
|
---|
160 |
|
---|
161 | regs->r_ax=0x1300;
|
---|
162 | regs->r_bx=0x000b;
|
---|
163 | regs->r_dx=0x1010;
|
---|
164 | regs->r_cx=0x0002;
|
---|
165 | regs->r_es=FP_SEG(pvar);
|
---|
166 | regs->r_bp=FP_OFF(pvar);
|
---|
167 | pokeb(regs->r_es,regs->r_bp,'t');
|
---|
168 | pokeb(regs->r_es,regs->r_bp+1,'b');
|
---|
169 | printf("Writing from %04x:%04x\n",regs->r_es,regs->r_bp);
|
---|
170 | intr(0x10,regs);
|
---|
171 |
|
---|
172 | }
|
---|
173 |
|
---|
174 | void switch_50(struct REGPACK *regs)
|
---|
175 | {
|
---|
176 | regs->r_ax=0x1202;
|
---|
177 | regs->r_bx=0x3000;
|
---|
178 | intr(0x10,regs);
|
---|
179 | regs->r_ax=0x0003;
|
---|
180 | intr(0x10,regs);
|
---|
181 | regs->r_ax=0x1112;
|
---|
182 | regs->r_bx=0x0000;
|
---|
183 | intr(0x10,regs);
|
---|
184 | }
|
---|
185 |
|
---|
186 | char exec_function(struct REGPACK *regs)
|
---|
187 | {char c;
|
---|
188 |
|
---|
189 | printf("--- Functions --------------------\n");
|
---|
190 | printf("a. int10 ax0003\t");
|
---|
191 | printf("b. int10 ax02\t");
|
---|
192 | printf("c. int10 ax03\t");
|
---|
193 | printf("d. int10 ax0501\n");
|
---|
194 | printf("e. int10 ax0602\t");
|
---|
195 | printf("f. int10 ax0702\t");
|
---|
196 | printf("g. int10 ax08\t");
|
---|
197 | printf("h. int10 ax09\t");
|
---|
198 | printf("i. int10 ax0a\n");
|
---|
199 | printf("j. int10 ax0f\t");
|
---|
200 | printf("k. int10 ax1b\t");
|
---|
201 | printf("l. int10 ax13\n");
|
---|
202 | printf("q. Quit\t");
|
---|
203 | printf("r. switch to 50 lines\n");
|
---|
204 | c=getche();
|
---|
205 |
|
---|
206 | switch(c)
|
---|
207 | {case 'a':
|
---|
208 | int10ax0003(regs);
|
---|
209 | break;
|
---|
210 | case 'b':
|
---|
211 | int10ax02(regs);
|
---|
212 | break;
|
---|
213 | case 'c':
|
---|
214 | int10ax03(regs);
|
---|
215 | break;
|
---|
216 | case 'd':
|
---|
217 | int10ax0501(regs);
|
---|
218 | break;
|
---|
219 | case 'e':
|
---|
220 | int10ax0602(regs);
|
---|
221 | break;
|
---|
222 | case 'f':
|
---|
223 | int10ax0702(regs);
|
---|
224 | break;
|
---|
225 | case 'g':
|
---|
226 | int10ax08(regs);
|
---|
227 | break;
|
---|
228 | case 'h':
|
---|
229 | int10ax09(regs);
|
---|
230 | break;
|
---|
231 | case 'i':
|
---|
232 | int10ax0a(regs);
|
---|
233 | break;
|
---|
234 | case 'j':
|
---|
235 | int10ax0f(regs);
|
---|
236 | break;
|
---|
237 | case 'k':
|
---|
238 | int10ax1b(regs);
|
---|
239 | break;
|
---|
240 | case 'l':
|
---|
241 | int10ax13(regs);
|
---|
242 | break;
|
---|
243 | case 'q':
|
---|
244 | break;
|
---|
245 | case 'r':
|
---|
246 | switch_50(regs);
|
---|
247 | break;
|
---|
248 | default:
|
---|
249 | printf("No such function!\n");
|
---|
250 | }
|
---|
251 |
|
---|
252 | if(c=='q')return 1;
|
---|
253 | while(kbhit()==0);
|
---|
254 | c=getch();
|
---|
255 |
|
---|
256 | return 0;
|
---|
257 | }
|
---|
258 |
|
---|
259 | void read_bios_area(BIOSAREA *biosarea)
|
---|
260 | {
|
---|
261 | biosarea->initial=peekb(0x40,0x10);
|
---|
262 | biosarea->current=peekb(0x40,0x49);
|
---|
263 | biosarea->nbcols=peek(0x40,0x4a);
|
---|
264 | biosarea->regen=peek(0x40,0x4c);
|
---|
265 | biosarea->start=peek(0x40,0x4e);
|
---|
266 | biosarea->curpos[0]=peek(0x40,0x50);
|
---|
267 | biosarea->curpos[1]=peek(0x40,0x52);
|
---|
268 | biosarea->curpos[2]=peek(0x40,0x54);
|
---|
269 | biosarea->curpos[3]=peek(0x40,0x56);
|
---|
270 | biosarea->curpos[4]=peek(0x40,0x58);
|
---|
271 | biosarea->curpos[5]=peek(0x40,0x5a);
|
---|
272 | biosarea->curpos[6]=peek(0x40,0x5c);
|
---|
273 | biosarea->curpos[7]=peek(0x40,0x5e);
|
---|
274 | biosarea->curtyp=peek(0x40,0x60);
|
---|
275 | biosarea->curpage=peekb(0x40,0x62);
|
---|
276 | biosarea->crtc=peek(0x40,0x63);
|
---|
277 | biosarea->msr=peekb(0x40,0x65);
|
---|
278 | biosarea->cgapal=peekb(0x40,0x66);
|
---|
279 | biosarea->nbrows=peekb(0x40,0x84);
|
---|
280 | biosarea->cheight=peek(0x40,0x85);
|
---|
281 | biosarea->ctl=peekb(0x40,0x87);
|
---|
282 | biosarea->switches=peekb(0x40,0x88);
|
---|
283 | biosarea->modeset=peekb(0x40,0x89);
|
---|
284 | biosarea->dcc=peekb(0x40,0x8a);
|
---|
285 | biosarea->vsseg=peek(0x40,0xa8);
|
---|
286 | biosarea->vsoffset=peek(0x40,0xaa);
|
---|
287 | }
|
---|
288 |
|
---|
289 | void show_bios_area(BIOSAREA *biosarea)
|
---|
290 | {
|
---|
291 | printf("--- BIOS area --------------------\n");
|
---|
292 | printf("initial : %02x\t",biosarea->initial);
|
---|
293 | printf("current : %02x\t",biosarea->current);
|
---|
294 | printf("nbcols : %04x\t",biosarea->nbcols);
|
---|
295 | printf("regen : %04x\t",biosarea->regen);
|
---|
296 | printf("start : %04x\n",biosarea->start);
|
---|
297 | printf("curpos : %04x %04x %04x %04x %04x %04x %04x %04x\n",
|
---|
298 | biosarea->curpos[0], biosarea->curpos[1], biosarea->curpos[2], biosarea->curpos[3],
|
---|
299 | biosarea->curpos[4], biosarea->curpos[5], biosarea->curpos[6], biosarea->curpos[7]);
|
---|
300 | printf("curtyp : %04x\t",biosarea->curtyp);
|
---|
301 | printf("curpage : %02x\t",biosarea->curpage);
|
---|
302 | printf("crtc : %04x\t",biosarea->crtc);
|
---|
303 | printf("msr : %04x\n",biosarea->msr);
|
---|
304 | printf("cgapal : %04x\t",biosarea->cgapal);
|
---|
305 | printf("nbrows-1: %02x\t",biosarea->nbrows);
|
---|
306 | printf("cheight : %04x\t",biosarea->cheight);
|
---|
307 | printf("ctl : %02x\n",biosarea->ctl);
|
---|
308 | printf("switches: %02x\t",biosarea->switches);
|
---|
309 | printf("modeset : %02x\t",biosarea->modeset);
|
---|
310 | printf("dcc : %02x\t",biosarea->dcc);
|
---|
311 | printf("vs : %04x:%04x\n",biosarea->vsseg,biosarea->vsoffset);
|
---|
312 | }
|
---|
313 |
|
---|
314 | void show_regs(struct REGPACK *regs)
|
---|
315 | {
|
---|
316 | printf("--- Registers --------------------\n");
|
---|
317 | printf("ax %04x\t",regs->r_ax);
|
---|
318 | printf("bx %04x\t",regs->r_bx);
|
---|
319 | printf("cx %04x\t",regs->r_cx);
|
---|
320 | printf("dx %04x\t",regs->r_dx);
|
---|
321 | printf("ds %04x\t",regs->r_ds);
|
---|
322 | printf("si %04x\t",regs->r_si);
|
---|
323 | printf("es %04x\t",regs->r_es);
|
---|
324 | printf("di %04x\n",regs->r_di);
|
---|
325 | }
|
---|
326 |
|
---|
327 | void reset_videomode()
|
---|
328 | {
|
---|
329 | struct REGPACK regs;
|
---|
330 |
|
---|
331 | regs.r_ax=0x0003;
|
---|
332 | intr(0x10,®s);
|
---|
333 | }
|
---|
334 |
|
---|
335 | void main()
|
---|
336 | {
|
---|
337 |
|
---|
338 | BIOSAREA biosarea;
|
---|
339 | struct REGPACK regs;
|
---|
340 |
|
---|
341 | directvideo=0;
|
---|
342 |
|
---|
343 | while(1)
|
---|
344 | {
|
---|
345 | read_bios_area(&biosarea);
|
---|
346 |
|
---|
347 | reset_videomode();
|
---|
348 | show_bios_area(&biosarea);
|
---|
349 | show_regs(®s);
|
---|
350 |
|
---|
351 | if(exec_function(®s)!=0)break;
|
---|
352 | }
|
---|
353 | }
|
---|