- new function dispi_get_bpp()
[vgabios.git] / tests / testbios.c
blob99da5a65fe1027653a8807afba7ec6a58c7c098e
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
6 It is used to test the behavior of the vgabios
7 */
9 #include <stdio.h>
10 #include <dos.h>
11 #include <conio.h>
14 typedef unsigned char Bit8u;
15 typedef unsigned short Bit16u;
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;
39 void int10ax0003(struct REGPACK *regs)
41 regs->r_ax=0x0003;
42 intr(0x10,regs);
45 void int10ax02(struct REGPACK *regs)
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");
54 void int10ax03(struct REGPACK *regs)
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);
62 void int10ax0501(struct REGPACK *regs)
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");
72 void int10ax0602(struct REGPACK *regs)
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");
82 void int10ax0702(struct REGPACK *regs)
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");
92 void int10ax08(struct REGPACK *regs)
94 regs->r_ax=0x0800;
95 regs->r_bx=0x0000;
96 intr(0x10,regs);
99 void int10ax09(struct REGPACK *regs)
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");
114 void int10ax0a(struct REGPACK *regs)
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);
124 void int10ax0f(struct REGPACK *regs)
126 regs->r_ax=0x0501;
127 intr(0x10,regs);
128 regs->r_ax=0x0f00;
129 intr(0x10,regs);
132 void int10ax1b(struct REGPACK *regs)
133 {unsigned char table[64];
134 unsigned char far *ptable;
135 int i;
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);
147 for(i=0;i<64;i++)
148 {if(i%16==0)printf("\n%02x ",i);
149 printf("%02x ",table[i]);
151 printf("\n");
154 static unsigned char var[64];
156 void int10ax13(struct REGPACK *regs)
157 {unsigned char far *pvar;
159 pvar=&var;
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);
174 void switch_50(struct REGPACK *regs)
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);
186 char exec_function(struct REGPACK *regs)
187 {char c;
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();
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");
252 if(c=='q')return 1;
253 while(kbhit()==0);
254 c=getch();
256 return 0;
259 void read_bios_area(BIOSAREA *biosarea)
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);
289 void show_bios_area(BIOSAREA *biosarea)
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);
314 void show_regs(struct REGPACK *regs)
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);
327 void reset_videomode()
329 struct REGPACK regs;
331 regs.r_ax=0x0003;
332 intr(0x10,&regs);
335 void main()
338 BIOSAREA biosarea;
339 struct REGPACK regs;
341 directvideo=0;
343 while(1)
345 read_bios_area(&biosarea);
347 reset_videomode();
348 show_bios_area(&biosarea);
349 show_regs(&regs);
351 if(exec_function(&regs)!=0)break;