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