#include #include #include #include #include "pset.h" /* ESをいじるため */ void _asm_es(char *, unsigned short); void _asm_es_pop(char *); #define ARRAY_SIZE ((144*224/8*2)+16) unsigned char org[ARRAY_SIZE]; /* セグメントアライン用 */ void main(void) { unsigned char far *vram; unsigned short seg, off; int i, x, y, c; memset(org, 0, ARRAY_SIZE); vram = (unsigned char far *)org; seg = FP_SEG(vram); off = FP_OFF(vram); seg += (off >> 4) +1; vram = (unsigned char far *)(MK_FP(seg, 0)); _asm_es("push es\nmov es, ax", seg); /* ↑ これでESにバッファの先頭をアラインしたアドレスが入る */ for(i = 0; i < 10000; i ++) { int addr; unsigned int dt, wd, od; unsigned int bit, mask; /* 座標と色を決定 */ x = rand( ) % 224; y = rand( ) % 144; c = rand( ) & 3; /* アドレスを計算 */ addr = ((x & ~7) + (y & 7) + (y & (~7)) * 28) *2; /* 書き込む前の状態を保存 */ od = dt = vram[addr] | (vram[addr +1] << 8); /* 書き込み+結果保存 */ pset(x, y, c); wd = vram[addr] | (vram[addr +1] << 8); /* ちゃんと動くルーチン版で書き込み */ bit = ((c & 2) << 7) | (c & 1); mask = 0x0101; bit <<= (~x) & 7; mask <<= (~x) & 7; mask = ~mask; dt &= mask; dt |= bit; /* データの整合性をチェック */ if(wd != dt) printf("(%x,%x):%d [%x : %x : %x]\n", x, y, c, od, wd, dt); /* 問題なければ書き込みを有効に. */ vram[addr] = dt & 0xff; vram[addr +1] = dt >> 8; } _asm_es_pop("pop es\n"); /* 忘れずに。 */ }