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