VirtualBox

source: vbox/trunk/src/VBox/Devices/Graphics/BIOS/tests/testbios.c@ 38905

最後變更 在這個檔案從38905是 26495,由 vboxsync 提交於 15 年 前

Devices: whitespace cleanup

  • 屬性 svn:eol-style 設為 native
  • 屬性 svn:keywords 設為 Author Date Id Revision
檔案大小: 7.1 KB
 
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
14typedef unsigned char Bit8u;
15typedef unsigned short Bit16u;
16
17typedef 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
39void int10ax0003(struct REGPACK *regs)
40{
41 regs->r_ax=0x0003;
42 intr(0x10,regs);
43}
44
45void 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
54void 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
62void 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
72void 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
82void 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
92void int10ax08(struct REGPACK *regs)
93{
94 regs->r_ax=0x0800;
95 regs->r_bx=0x0000;
96 intr(0x10,regs);
97}
98
99void 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
114void 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
124void 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
132void 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
154static unsigned char var[64];
155
156void 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
174void 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
186char 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
259void 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
289void 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
314void 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
327void reset_videomode()
328{
329 struct REGPACK regs;
330
331 regs.r_ax=0x0003;
332 intr(0x10,&regs);
333}
334
335void 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}
注意: 瀏覽 TracBrowser 來幫助您使用儲存庫瀏覽器

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette