[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 編程技術 > 源碼天堂 > 正文
在 UNIX 系統下直接訪問video ram(顯存)
本文出自: http://go3.163.com/~axiom999/ (2001-06-18 13:04:00)
    我們在 UNIX 系統下用 C 語言開發軟件一般要用到光標功能控制庫 curses, 但是使用 curses 編制的軟件目標模塊大, 執行速度慢. 我們可以繞過 curses, 直接訪問視頻內存 (video ram) 來實現
諸如定位顯示, 顯示區域保存及恢復, 色彩及動畫等多種顯示效果.本文通過直接訪問 video ram 技術顯示 54 張撲克牌.

程序清單:
#include "sys/types.h"
#include "sys/console.h"
#include "sys/vid.h"
#include "sys/ioctl.h"

#define HONGTAO 3
#define FANGKUAI 4
#define MEIHUA 5
#define HEITAO 6
#define XIAOWANG 1
#define DAWANG 2
#define HORIZON 196
#define VERTICAL 179
#define UPLEFT 218
#define UPRIGHT 191
#define DNLEFT 192
#define DNRIGHT 217

char *screen; /* video ram 地址 */
void cputc(), cputs();
void showcard();
char card();
main()
{
int i;
/* 設置 VGA 80X25 顯示方式 */
if (-1==ioctl(0,SW_VGA80x25,0l)) {
perror("ioctl");
exit(1);
}
if ((screen=(char*)ioctl(0,MAPCONS,0l))==(char*)(-1)) {
perror("ioctl");
exit(2);
}
showcard(10,3,XIAOWANG); /* 顯示大王 */
showcard(15,3,DAWANG); /* 顯示小王 */
for (i=1;i<=13;i++) {
showcard(5,5+i*5,HONGTAO,i); /* 顯示紅桃 */
showcard(10,5+i*5,FANGKUAI,i); /* 顯示方塊 */
showcard(15,5+i*5,MEIHUA,i); /* 顯示梅花 */
showcard(20,5+i*5,HEITAO,i); /* 顯示黑桃 */
}
}
void cputs(row,col,forecolor,backcolor,msg)
int row,col,backcolor,forecolor;
char *msg;
{
char color,*t,*s;
color=(0x0f^backcolor)<<4|(0x0f^forecolor);
t=screen+(row*80+col)*2;
for (s=msg;*s;s++) {
*t++=*s;
*t++=~color;
}
}
void cputc(row,col,forecolor,backcolor,c)
int row,col,forecolor,backcolor;
char c;
{
char *t;
t=screen+(row*80+col)*2;
*t++=c;
*t=~((0x0f^backcolor)<<4|(0x0f^forecolor));
}
void showcard(row,col,cardtype,value)
int row,col,cardtype,value;
{
char buf[5];
sprintf(buf,"%c%c%c%c",UPLEFT,HORIZON,HORIZON,UPRIGHT);
cputs(row,col,BLUE,WHITE,buf);
sprintf(buf,"%c%c%c%c",DNLEFT,HORIZON,HORIZON,DNRIGHT);
cputs(row+2,col,BLUE,WHITE,buf);
cputc(row+1,col,BLUE,WHITE,VERTICAL);
cputc(row+1,col+3,BLUE,WHITE,VERTICAL);
if (cardtype==MEIHUA || cardtype==HEITAO) {
cputc(row+1,col+1,BLACK,WHITE,cardtype);
cputc(row+1,col+2,BLACK,WHITE,card(value));
} else if (cardtype==HONGTAO || cardtype==FANGKUAI) {
cputc(row+1,col+1,RED,WHITE,cardtype);
cputc(row+1,col+2,RED,WHITE,card(value));
} else if (cardtype==DAWANG) {
cputc(row+1,col+1,MAGENTA,WHITE,DAWANG);
cputc(row+1,col+2,MAGENTA,WHITE,DAWANG);
} else if (cardtype==XIAOWANG) {
cputc(row+1,col+1,BLUE,WHITE,XIAOWANG);
cputc(row+1,col+2,BLUE,WHITE,XIAOWANG);
}
}
char card(value)
int value;
{
if (value>=2 && value <=9) return value+'0';
else switch (value) {
case 1: return 'A';
case 10: return 'T';
case 11: return 'J';
case 12: return 'Q';
case 13: return 'K';
}
} (http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
 

★  樊強制作 歡迎分享  ★