#define MAXX 640
#define MAXY 480
static float asp_ratio = 1; // 寬高比修正
static void selectpage(int page) {
union REGS r;
r.x.ax = 0x4f05; r.x.bx = 0; r.x.dx = page;
int86(0x10, &r, &r); // VESA BIOS 切頁
}
void init256() { // 進入 640x480x256 模式 (0x101)
union REGS r;
r.x.ax = 0x4f02; r.x.bx = 0x101;
int86(0x10, &r, &r);
}
void exit256() { // 返回文本模式 (模式 3)
union REGS r;
r.h.ah = 0; r.h.al = 3;
int86(0x10, &r, &r);
}
void putpixel(int x, int y, int color) {
long i = y * MAXX + x;
int tt = i >> 16; i &= 0xffff;
static int t = 0;
if (t != tt) selectpage(tt), t = tt;
*(char far *)0xA0000000L[i] = (char)color; // 直接寫顯存
}
int getpixel(int x, int y) { ... } // 同理讀取
line:Bresenham 整數算法,處理八個象限。box:繪製矩形邊框(四條邊)。fillbox:雙層循環填充矩形區域。circle:中點畫圓算法,配合 plot_circle 八向對稱繪點,含寬高比修正。main() {
init256();
box(100,100,200,200,35);
circle(300,250,200,35);
fillbox(200,200,350,350,35);
getch();
exit256();
}
直接操作 VESA 線性帧緩衝區,無需 BGI 驅動,適合 DOS 實模式下高性能圖形開發。