/* (c) 2010 by Gerhard Wiesinger Source Code released under GNU GPL, v2 only and not any later version. http://www.gnu.org/licenses/gpl-2.0.html Must be compiled with OpenWatcom C for long long support. */ #ifdef __WATCOMC__ #if defined(__386__) && !defined(__WINDOWS_386__) #error Wrong build target, use wcc instead of wcc386! #endif #endif /* end __WATCOMC__ */ #include #include #include #include #include #include #define INT_SCREEN 0x10 #define LOOP 100L #define SIZE_64K 65536 #define SIZE_64K_1 65535 #define TEST_SEGMENT 0xA000 #define TEST_OFFSET 0x0000 typedef enum { TEST_BYTE, TEST_WORD, TEST_DWORD, TEST_QWORD } tests; typedef unsigned char UCHAR; typedef unsigned int WORD; typedef unsigned long DWORD; typedef unsigned long long QWORD; QWORD testByte_old(void) { DWORD i = 0; UCHAR far* p = MK_FP(TEST_SEGMENT, TEST_OFFSET); for(i=0;i < SIZE_64K/sizeof(UCHAR);i++) *p++ = 0; return SIZE_64K; } QWORD testWord_old(void) { DWORD i = 0; WORD far* p = MK_FP(TEST_SEGMENT, TEST_OFFSET); for(i=0;i < SIZE_64K/sizeof(WORD);i++) *p++ = 0; return SIZE_64K; } QWORD testDWord_old(void) { DWORD i = 0; DWORD far* p = MK_FP(TEST_SEGMENT, TEST_OFFSET); for(i=0;i < SIZE_64K/sizeof(DWORD);i++) *p++ = 0; return SIZE_64K; } QWORD testQWord_old(void) { DWORD i = 0; QWORD far* p = MK_FP(TEST_SEGMENT, TEST_OFFSET); for(i=0;i < SIZE_64K/sizeof(QWORD);i++) *p++ = 0; return SIZE_64K; } QWORD testByte(void) { WORD i = 0; UCHAR far* p = MK_FP(TEST_SEGMENT, TEST_OFFSET); for(i=0;i < SIZE_64K/2/sizeof(UCHAR);i++) *p++ = 0; return SIZE_64K; } QWORD testWord(void) { WORD i = 0; WORD far* p = MK_FP(TEST_SEGMENT, TEST_OFFSET); for(i=0;i < SIZE_64K/sizeof(WORD);i++) *p++ = 0; return SIZE_64K; } QWORD testDWord(void) { WORD i = 0; DWORD far* p = MK_FP(TEST_SEGMENT, TEST_OFFSET); for(i=0;i < SIZE_64K/sizeof(DWORD);i++) *p++ = 0; return SIZE_64K; } QWORD testQWord(void) { WORD i = 0; QWORD far* p = MK_FP(TEST_SEGMENT, TEST_OFFSET); for(i=0;i < SIZE_64K/sizeof(QWORD);i++) *p++ = 0; return SIZE_64K; } time_t memperf(tests current_test, QWORD* bytes) { DWORD i = 0; time_t start; time_t stop; *bytes = 0L; start = time(NULL); stop = start; while ((stop-start) < 10) { for (i = 0; i < LOOP; i++) { switch(current_test) { case TEST_BYTE: *bytes += testByte(); break; case TEST_WORD: *bytes += testWord(); break; case TEST_DWORD: *bytes += testDWord(); break; case TEST_QWORD: *bytes += testQWord(); break; default: return 0; break; } } stop = time(NULL); } return (stop - start); } int main(int argc, char* argv[]) { union REGS inregs, outregs; struct SREGS outsregs; time_t t_b; time_t t_w; time_t t_dw; time_t t_qw; QWORD bytes_b; QWORD bytes_w; QWORD bytes_dw; QWORD bytes_qw; printf("MEMPERF video performance V1.1, (c) 2010 by Gerhard Wiesinger\n\n"); inregs.x.ax = 0x4F02; inregs.x.bx = 0xC000 | 0x101; // bh=bit 15=0 (clear), bit14=0 (windowed) int86x(INT_SCREEN, &inregs, &outregs, &outsregs); /* Call INT 10h */ t_b = memperf(TEST_BYTE, &bytes_b); t_w = memperf(TEST_WORD, &bytes_w); t_dw = memperf(TEST_DWORD, &bytes_dw); t_qw = memperf(TEST_QWORD, &bytes_qw); inregs.x.ax = 0x0003; int86x(INT_SCREEN, &inregs, &outregs, &outsregs); /* Call INT 10h */ printf("MEMPERF video performance V1.1, (c) 2010 by Gerhard Wiesinger\n\n"); printf("BYTE performance, time=%lus, bytes=%llu, rate=%.3f MB/s\n", t_b, bytes_b, 1.0*bytes_b/t_b/1024.0/1024.0); printf("WORD performance, time=%lus, bytes=%llu, rate=%.3f MB/s\n", t_w, bytes_w, 1.0*bytes_w/t_w/1024.0/1024.0); printf("DWORD performance, time=%lus, bytes=%llu, rate=%.3f MB/s\n", t_dw, bytes_dw, 1.0*bytes_dw/t_dw/1024.0/1024.0); printf("QWORD performance, time=%lus, bytes=%llu, rate=%.3f MB/s\n", t_qw, bytes_qw, 1.0*bytes_qw/t_qw/1024.0/1024.0); exit(0); return 0; }