|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.