Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / vgabios / tests / testbios.c
diff --git a/qemu/roms/vgabios/tests/testbios.c b/qemu/roms/vgabios/tests/testbios.c
new file mode 100644 (file)
index 0000000..99da5a6
--- /dev/null
@@ -0,0 +1,353 @@
+/* \r
+   This is a little turbo C program that executes\r
+   several int10, and let you inspect the content\r
+   of the vgabios area\r
+\r
+   It is used to test the behavior of the vgabios\r
+*/\r
+\r
+#include <stdio.h>\r
+#include <dos.h>\r
+#include <conio.h>\r
+\r
+\r
+typedef unsigned char  Bit8u;\r
+typedef unsigned short Bit16u;\r
+\r
+typedef struct\r
+{Bit8u initial;\r
+ Bit8u current;\r
+ Bit16u nbcols;\r
+ Bit16u regen;\r
+ Bit16u start;\r
+ Bit16u curpos[8];\r
+ Bit8u curtyp;\r
+ Bit8u curpage;\r
+ Bit16u crtc;\r
+ Bit16u msr;\r
+ Bit16u cgapal;\r
+ Bit8u nbrows;\r
+ Bit16u cheight;\r
+ Bit8u ctl;\r
+ Bit8u switches;\r
+ Bit8u modeset;\r
+ Bit8u dcc;\r
+ Bit16u vsseg;\r
+ Bit16u vsoffset;\r
+} BIOSAREA;\r
+\r
+void int10ax0003(struct REGPACK *regs)\r
+{\r
+ regs->r_ax=0x0003;\r
+ intr(0x10,regs);\r
+}\r
+\r
+void int10ax02(struct REGPACK *regs)\r
+{\r
+ regs->r_ax=0x0200;\r
+ regs->r_bx=0x0000;\r
+ regs->r_dx=0x1710;\r
+ intr(0x10,regs);\r
+ printf("We are now at 24/17");\r
+}\r
+\r
+void int10ax03(struct REGPACK *regs)\r
+{\r
+ regs->r_ax=0x0300;\r
+ regs->r_bx=0x0000;\r
+ intr(0x10,regs);\r
+ printf("\nCursor is ax%04x cx%04x dx%04x\n",regs->r_ax,regs->r_cx,regs->r_dx);\r
+}\r
+\r
+void int10ax0501(struct REGPACK *regs)\r
+{\r
+ regs->r_ax=0x0501;\r
+ intr(0x10,regs);\r
+ regs->r_ax=0x0e61;\r
+ regs->r_bx=0x0000;\r
+ intr(0x10,regs);\r
+ printf("We are now on page 2");\r
+}\r
+\r
+void int10ax0602(struct REGPACK *regs)\r
+{\r
+ regs->r_ax=0x0602;\r
+ regs->r_bx=0x0700;\r
+ regs->r_cx=0x0101;\r
+ regs->r_dx=0x0a0a;\r
+ intr(0x10,regs);\r
+ printf("Scrolled 2 up");\r
+}\r
+\r
+void int10ax0702(struct REGPACK *regs)\r
+{\r
+ regs->r_ax=0x0702;\r
+ regs->r_bx=0x0700;\r
+ regs->r_cx=0x0101;\r
+ regs->r_dx=0x0a0a;\r
+ intr(0x10,regs);\r
+ printf("Scrolled 2 down");\r
+}\r
+\r
+void int10ax08(struct REGPACK *regs)\r
+{\r
+ regs->r_ax=0x0800;\r
+ regs->r_bx=0x0000;\r
+ intr(0x10,regs);\r
+}\r
+\r
+void int10ax09(struct REGPACK *regs)\r
+{\r
+ char attr;\r
+ regs->r_ax=0x0501;\r
+ intr(0x10,regs);\r
+ for(attr=0;attr<16;attr++)\r
+  {printf("%02x ",attr);\r
+   regs->r_ax=0x0961+attr;\r
+   regs->r_bx=0x0100+attr;\r
+   regs->r_cx=0x0016;\r
+   intr(0x10,regs);\r
+   printf("\n");\r
+  }\r
+}\r
+\r
+void int10ax0a(struct REGPACK *regs)\r
+{\r
+ regs->r_ax=0x0501;\r
+ intr(0x10,regs);\r
+ regs->r_ax=0x0a62;\r
+ regs->r_bx=0x0101;\r
+ regs->r_cx=0x0016;\r
+ intr(0x10,regs);\r
+}\r
+\r
+void int10ax0f(struct REGPACK *regs)\r
+{\r
+ regs->r_ax=0x0501;\r
+ intr(0x10,regs);\r
+ regs->r_ax=0x0f00;\r
+ intr(0x10,regs);\r
+}\r
+\r
+void int10ax1b(struct REGPACK *regs)\r
+{unsigned char table[64];\r
+ unsigned char far *ptable;\r
+ int  i;\r
+\r
+ regs->r_ax=0x0501;\r
+ intr(0x10,regs);\r
+ regs->r_ax=0x1b00;\r
+ regs->r_bx=0x0000;\r
+ ptable=&table;\r
+ regs->r_es=FP_SEG(ptable);\r
+ regs->r_di=FP_OFF(ptable);\r
+ printf("Read state info in %04x:%04x\n",regs->r_es,regs->r_di);\r
+ intr(0x10,regs);\r
+\r
+ for(i=0;i<64;i++)\r
+  {if(i%16==0)printf("\n%02x ",i);\r
+   printf("%02x ",table[i]);\r
+  }\r
+ printf("\n");\r
+}\r
+\r
+static unsigned char var[64];\r
+\r
+void int10ax13(struct REGPACK *regs)\r
+{unsigned char far *pvar;\r
+\r
+ pvar=&var;\r
+\r
+ regs->r_ax=0x1300;\r
+ regs->r_bx=0x000b;\r
+ regs->r_dx=0x1010;\r
+ regs->r_cx=0x0002;\r
+ regs->r_es=FP_SEG(pvar);\r
+ regs->r_bp=FP_OFF(pvar);\r
+ pokeb(regs->r_es,regs->r_bp,'t');\r
+ pokeb(regs->r_es,regs->r_bp+1,'b');\r
+ printf("Writing from %04x:%04x\n",regs->r_es,regs->r_bp);\r
+ intr(0x10,regs);\r
\r
+}\r
+\r
+void switch_50(struct REGPACK *regs)\r
+{\r
+ regs->r_ax=0x1202;\r
+ regs->r_bx=0x3000;\r
+ intr(0x10,regs);\r
+ regs->r_ax=0x0003;\r
+ intr(0x10,regs);\r
+ regs->r_ax=0x1112;\r
+ regs->r_bx=0x0000;\r
+ intr(0x10,regs);\r
+}\r
+\r
+char exec_function(struct REGPACK *regs)\r
+{char c;\r
+\r
+ printf("--- Functions --------------------\n");\r
+ printf("a. int10 ax0003\t");\r
+ printf("b. int10 ax02\t");\r
+ printf("c. int10 ax03\t");\r
+ printf("d. int10 ax0501\n");\r
+ printf("e. int10 ax0602\t");\r
+ printf("f. int10 ax0702\t");\r
+ printf("g. int10 ax08\t");\r
+ printf("h. int10 ax09\t");\r
+ printf("i. int10 ax0a\n");\r
+ printf("j. int10 ax0f\t");\r
+ printf("k. int10 ax1b\t");\r
+ printf("l. int10 ax13\n");\r
+ printf("q. Quit\t");\r
+ printf("r. switch to 50 lines\n");\r
+ c=getche();\r
\r
+ switch(c)\r
+  {case 'a':\r
+    int10ax0003(regs);\r
+    break;\r
+   case 'b':\r
+    int10ax02(regs);\r
+    break;\r
+   case 'c':\r
+    int10ax03(regs);\r
+    break;\r
+   case 'd':\r
+    int10ax0501(regs);\r
+    break;\r
+   case 'e':\r
+    int10ax0602(regs);\r
+    break;\r
+   case 'f':\r
+    int10ax0702(regs);\r
+    break;\r
+   case 'g':\r
+    int10ax08(regs);\r
+    break;\r
+   case 'h':\r
+    int10ax09(regs);\r
+    break;\r
+   case 'i':\r
+    int10ax0a(regs);\r
+    break;\r
+   case 'j':\r
+    int10ax0f(regs);\r
+    break;\r
+   case 'k':\r
+    int10ax1b(regs);\r
+    break;\r
+   case 'l':\r
+    int10ax13(regs);\r
+    break;\r
+   case 'q':\r
+    break;\r
+   case 'r':\r
+    switch_50(regs);\r
+    break;\r
+   default:\r
+    printf("No such function!\n");\r
+  }\r
+\r
+ if(c=='q')return 1;\r
+ while(kbhit()==0);\r
+ c=getch();\r
\r
+ return 0;\r
+}\r
+\r
+void read_bios_area(BIOSAREA *biosarea)\r
+{\r
+ biosarea->initial=peekb(0x40,0x10);\r
+ biosarea->current=peekb(0x40,0x49);\r
+ biosarea->nbcols=peek(0x40,0x4a);\r
+ biosarea->regen=peek(0x40,0x4c);\r
+ biosarea->start=peek(0x40,0x4e);\r
+ biosarea->curpos[0]=peek(0x40,0x50);\r
+ biosarea->curpos[1]=peek(0x40,0x52);\r
+ biosarea->curpos[2]=peek(0x40,0x54);\r
+ biosarea->curpos[3]=peek(0x40,0x56);\r
+ biosarea->curpos[4]=peek(0x40,0x58);\r
+ biosarea->curpos[5]=peek(0x40,0x5a);\r
+ biosarea->curpos[6]=peek(0x40,0x5c);\r
+ biosarea->curpos[7]=peek(0x40,0x5e);\r
+ biosarea->curtyp=peek(0x40,0x60);\r
+ biosarea->curpage=peekb(0x40,0x62);\r
+ biosarea->crtc=peek(0x40,0x63);\r
+ biosarea->msr=peekb(0x40,0x65);\r
+ biosarea->cgapal=peekb(0x40,0x66);\r
+ biosarea->nbrows=peekb(0x40,0x84);\r
+ biosarea->cheight=peek(0x40,0x85);\r
+ biosarea->ctl=peekb(0x40,0x87);\r
+ biosarea->switches=peekb(0x40,0x88);\r
+ biosarea->modeset=peekb(0x40,0x89);\r
+ biosarea->dcc=peekb(0x40,0x8a);\r
+ biosarea->vsseg=peek(0x40,0xa8);\r
+ biosarea->vsoffset=peek(0x40,0xaa);\r
+}\r
+\r
+void show_bios_area(BIOSAREA *biosarea)\r
+{\r
+ printf("--- BIOS area --------------------\n");\r
+ printf("initial : %02x\t",biosarea->initial);\r
+ printf("current : %02x\t",biosarea->current);\r
+ printf("nbcols  : %04x\t",biosarea->nbcols);\r
+ printf("regen   : %04x\t",biosarea->regen);\r
+ printf("start   : %04x\n",biosarea->start);\r
+ printf("curpos  : %04x %04x %04x %04x %04x %04x %04x %04x\n",\r
+   biosarea->curpos[0], biosarea->curpos[1], biosarea->curpos[2], biosarea->curpos[3],\r
+   biosarea->curpos[4], biosarea->curpos[5], biosarea->curpos[6], biosarea->curpos[7]);\r
+ printf("curtyp  : %04x\t",biosarea->curtyp);\r
+ printf("curpage : %02x\t",biosarea->curpage);\r
+ printf("crtc    : %04x\t",biosarea->crtc);\r
+ printf("msr     : %04x\n",biosarea->msr);\r
+ printf("cgapal  : %04x\t",biosarea->cgapal);\r
+ printf("nbrows-1: %02x\t",biosarea->nbrows);\r
+ printf("cheight : %04x\t",biosarea->cheight);\r
+ printf("ctl     : %02x\n",biosarea->ctl);\r
+ printf("switches: %02x\t",biosarea->switches);\r
+ printf("modeset : %02x\t",biosarea->modeset);\r
+ printf("dcc     : %02x\t",biosarea->dcc);\r
+ printf("vs      : %04x:%04x\n",biosarea->vsseg,biosarea->vsoffset);\r
+}\r
+\r
+void show_regs(struct REGPACK *regs)\r
+{\r
+ printf("--- Registers --------------------\n");\r
+ printf("ax %04x\t",regs->r_ax);\r
+ printf("bx %04x\t",regs->r_bx);\r
+ printf("cx %04x\t",regs->r_cx);\r
+ printf("dx %04x\t",regs->r_dx);\r
+ printf("ds %04x\t",regs->r_ds);\r
+ printf("si %04x\t",regs->r_si);\r
+ printf("es %04x\t",regs->r_es);\r
+ printf("di %04x\n",regs->r_di);\r
+}\r
+\r
+void reset_videomode()\r
+{\r
+ struct REGPACK regs;\r
+\r
+ regs.r_ax=0x0003;\r
+ intr(0x10,&regs);\r
+}\r
+\r
+void main()\r
+{\r
+\r
+ BIOSAREA biosarea;\r
+ struct REGPACK regs;\r
+\r
+ directvideo=0;\r
\r
+ while(1)\r
+  {\r
+   read_bios_area(&biosarea);\r
+\r
+   reset_videomode();\r
+   show_bios_area(&biosarea);\r
+   show_regs(&regs);\r
+\r
+   if(exec_function(&regs)!=0)break;\r
+  }\r
+}\r