• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
int10ax0003(struct REGPACK * regs)39 void int10ax0003(struct REGPACK *regs)
40 {
41  regs->r_ax=0x0003;
42  intr(0x10,regs);
43 }
44 
int10ax02(struct REGPACK * regs)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 
int10ax03(struct REGPACK * regs)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 
int10ax0501(struct REGPACK * regs)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 
int10ax0602(struct REGPACK * regs)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 
int10ax0702(struct REGPACK * regs)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 
int10ax08(struct REGPACK * regs)92 void int10ax08(struct REGPACK *regs)
93 {
94  regs->r_ax=0x0800;
95  regs->r_bx=0x0000;
96  intr(0x10,regs);
97 }
98 
int10ax09(struct REGPACK * regs)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 
int10ax0a(struct REGPACK * regs)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 
int10ax0f(struct REGPACK * regs)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 
int10ax1b(struct REGPACK * regs)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 
int10ax13(struct REGPACK * regs)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 
switch_50(struct REGPACK * regs)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 
exec_function(struct REGPACK * regs)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 
read_bios_area(BIOSAREA * biosarea)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 
show_bios_area(BIOSAREA * biosarea)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 
show_regs(struct REGPACK * regs)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 
reset_videomode()327 void reset_videomode()
328 {
329  struct REGPACK regs;
330 
331  regs.r_ax=0x0003;
332  intr(0x10,&regs);
333 }
334 
main()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(&regs);
350 
351    if(exec_function(&regs)!=0)break;
352   }
353 }
354