[26495] | 1 | /*
|
---|
[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);
|
---|
[26495] | 171 |
|
---|
[1] | 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();
|
---|
[26495] | 205 |
|
---|
[1] | 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();
|
---|
[26495] | 255 |
|
---|
[1] | 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;
|
---|
[26495] | 342 |
|
---|
[1] | 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 | }
|
---|