home *** CD-ROM | disk | FTP | other *** search
- /*
- TestPat.CPP version 1.0
- by Robert Schmidt of Ztiff Zox Softwear 1993
-
- Defines the member functions of the TestPatterns class declared in
- TestPat.HPP.
- */
-
- #include <dos.h>
- #include <mem.h>
- #include <conio.h>
- #include <iostream.h>
- #include "Screen.HPP"
- #include "TestPat.HPP"
-
- extern char *graphScr;
- extern unsigned *textScr;
- extern unsigned editHeight;
-
- // These are the text strings identifying each test to the user.
-
- char *TestPatterns::string[TestPatterns::tests] =
- {
- "Text screen, 16 point",
- "Text screen, 8 point",
- "4 planes, 16 colors",
- "1 plane, 256 colors",
- "4 planes, 256 colors"
- };
-
-
- // TestPatterns::run() puts the given test onto the screen.
-
- void TestPatterns::run()
- {
- unsigned a,c;
- unsigned long offset;
-
- outportb(0x3c4,0x02); //get write plane enable
- unsigned plane=inportb(0x3c5);
-
- outportb(0x3d4,0x13); //get screen width in words
- unsigned width=inportb(0x3d5)*2; //convert to bytes
-
- // Now select the correct initialization method:
-
- switch (testNo)
- {
- case test1x256:
- case test4x16:
- case test4x256:
- // All graphics modes: clear the screen, but take care of
- // write enabling all planes.
- outport(0x3c4,0x0f02);
- memset(graphScr, 0, 0xffff);
- outportb(0x3c4,0x02);
- outportb(0x3c5,plane);
- break;
-
- case testText16: // set 8x16 font
- _AX = 0x1104;
- _BL = 0;
- geninterrupt(0x10);
- goto commonText;
- case testText8: // set 8x8 font
- _AX = 0x1102;
- _BL = 0;
- geninterrupt(0x10);
- commonText:
- // Just blank the text screen.
- memset(textScr, 0, 8000);
- }
-
- // Now for the selected pattern. None of them are very impressive,
- // but it kinda gives you an idea of the mode. If you have ideas
- // for more informative tests, please let me know!
-
- switch (testNo)
- {
- case testText16:
- case testText8:
-
- // Fill top line with the sequence "0123456789" lt grey/black:
- a = 0;
- for (c=0; c<width; c++)
- textScr[a++] = ('0'+(c+1)%10) | 0x0700;
-
- // Then fill 4 lines with the ASCII set in white on blue:
- for (c=0; c<5*width; c++)
- textScr[a++] = c | 0x1f00;
-
- // Now fill the rest with the sequence "ABCDEFGHIJ" in all color
- // combinations (except blinking!):
- c = 0;
- while (a < 0x4800)
- textScr[a++] = ('A'+c%('K'-'A')) | ((c&0x7f)<<8), c++;
- break;
-
- case test1x256:
-
- // Fill the first 32 lines with 1 pixel wide colored vertical
- // lines.
- for (c=0; c<width*4; c++)
- for (a=0; a<32; a++)
- graphScr[a*width*4+c]=c;
-
- // Fill the rest with 1 pixel high horizontal lines.
- c=0;
- offset=32*4*width;
- do {
- memset(graphScr+offset, c++, width*4);
- //horizontal lines, 1 color each
- offset+=width<<2;
- }
- while (offset < (0xffff-width<<2));
- break;
-
- case test4x256:
-
- // This test is affected by the Write Plane Enable register.
- // First put up 32 horizontal lines in the 32 first colors.
- for (c=0; c<(width<<5); c++)
- graphScr[c]=c/width;
-
- // Then fill the rest with vertical lines. This is too slow!
- offset=c;
- c=0;
- a=1;
- do {
- outportb(0x3c5,a); //Set write plane enable
- graphScr[offset]=c;
-
- if ((a<<=1)>8)
- {
- a=1;
- ++offset;
- }
- if ((++c)==width<<2)
- c=0;
- }
- while (offset <= 0xffff);
- break;
- case test4x16:
-
- // Fill first 32 lines with thick vertical stripes alternating
- // between black and the color selected by Write Plane Enable.
- for (c=0; c<(width<<5); c++)
- graphScr[c]=0x0f;
-
- // Fill the rest with various bit patterns, in all colors.
- for (a=0; a<256; a++)
- {
- outportb(0x3c5,a);
- memset(graphScr+4000+a*width, a, width);
- }
- break;
- }
- }
-
-
- // tellTest() puts the name of the current test at the correct position on
- // the edit screen.
-
- void TestPatterns::tellTest()
- {
- gotoxy(42,editHeight);
- textattr(TESTHEADER_COLOR);
- cprintf("Current test: ");
- textattr(TESTSTRING_COLOR);
- cprintf(string[testNo]);
- clreol();
- }
-