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 14 typedef unsigned char Bit8u; 15 typedef unsigned short Bit16u; 16 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; 38 39 void int10ax0003(struct REGPACK *regs) 40 { 41 regs->r_ax=0x0003; 42 intr(0x10,regs); 43 } 44 45 void 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 54 void 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 62 void 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 72 void 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 82 void 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 92 void int10ax08(struct REGPACK *regs) 93 { 94 regs->r_ax=0x0800; 95 regs->r_bx=0x0000; 96 intr(0x10,regs); 97 } 98 99 void 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 114 void 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 124 void 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 132 void 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 154 static unsigned char var[64]; 155 156 void 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 174 void 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 186 char 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 259 void 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 289 void 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 314 void 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 327 void reset_videomode() 328 { 329 struct REGPACK regs; 330 331 regs.r_ax=0x0003; 332 intr(0x10,®s); 333 } 334 335 void 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(®s); 350 351 if(exec_function(®s)!=0)break; 352 } 353 } 354