⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 core_vga.c

📁 嵌入式开发 嵌入式开发 嵌入式开发
💻 C
📖 第 1 页 / 共 5 页
字号:
/********************
 Filename: CORE_VGA.C
 History&DateTime:
    02/13/2007
        在 PutPixel() 中增加了 CursorDrawing 的使能
    12/25/2006
        进行整体优化 提高执行速度
    02/12/2007
        加入了CursorDrawing标志
        为了能同步处理鼠标指针的绘制和响应上的时间差
********************/
#define _CORE_VGA_INC
#include <alloc.h>
#include "ST3000.H"
#include "STRUC_3K.H"
#include "BT848.H"
#include "CORE_VGA.H"

#define FABS(a) (((a)>=0) ? (a) : -(a))

struct {
    char VESASignature[4];
    short VESAVersion;
    char far *OEMStringPtr;
    long Capabilities;
    unsigned far *VideoModePtr;
    short TotalMemory;
    short OemSoftwareRev;
    long OemVendorNamePtr;
    long OemProductNamePtr;
    long OemProductRevPtr;
    char reserved[222];
    char OemDATA[256];
} vesainfoblock;

struct {
    unsigned short ModeAttributes;
    unsigned char WinAAttributes;
    unsigned char WinBAttributes;
    unsigned short WinGranularity;
    unsigned short WinSize;
    unsigned short WinASegment;
    unsigned short WinBSegment;
    void (far *WinFuncPtr)(void);
    unsigned short BytesPerScanLine;
    unsigned short XResolution;
    unsigned short YResolution;
    unsigned char XCharSize;
    unsigned char YCharSize;
    unsigned char NumberOfPlanes;
    unsigned char BitsPerPixel;
    unsigned char NumberOfBanks;
    unsigned char MemoryModel;
    unsigned char BankSize;
    unsigned char NumberOfImagePages;
    unsigned char res1;
    unsigned char RedMaskSize;
    unsigned char RedFieldPosition;
    unsigned char GreenMaskSize;
    unsigned char GreenFieldPosition;
    unsigned char BlueMaskSize;
    unsigned char BlueFieldPosition;
    unsigned char RsvdMaskSize;
    unsigned char RsvdFieldPosition;
    unsigned char DirectColorModeInfo;
    unsigned far *VideoPtr;
    long OffScreenMemOffset;
    short OffScreenMemSize;
    char res2[206];
} VesaModeInfoBlock;

typedef struct {
    int nCurBank,nBytesPerLine;
} graphatt;
graphatt g_graphatt;

int BitsOfPixel=4;
static int currx,curry;
static unsigned g_nBankShift; // Bank granularity adjust factor
static unsigned char far *LocalScrPtr; // Pointer to start of video memory

static int count_line=0;
static unsigned filltemp[3][256]={0};

// (vgap=20; hgap=20) (wid=60; hei=60)
#define softkey_wid 70 // 键盘 键钮宽度
#define softkey_hei 70 // 键盘 键钮高度
#define softkey_vert 10 // 键盘 键钮垂直间距
#define softkey_hori 10 // 键盘 键钮水平间距
int g_Klength=0; // 键盘输入有效数字个数
unsigned char g_Kmask=0,Dispbuf[20]={0},Tempbuf[20]={0};
  /*
    g_Kmask : 
        bit0=1 不允许小数输入; bit0=0 允许小数输入
        bit1=1 不允许输入符号; bit1=0 允许输入符号
        bit4=1 限制小数位数为1位; bit4=0 默认小数位数2位
  */
typedef struct {
    int x,y;
    unsigned char kName[5],kASC;
} SimKeys;
SimKeys KBMatrix_Num[16]={
    {0, 0, "0", 0x30},
    {0, 0, "1", 0x31},
    {0, 0, "2", 0x32},
    {0, 0, "3", 0x33},
    {0, 0, "4", 0x34},
    {0, 0, "5", 0x35},
    {0, 0, "6", 0x36},
    {0, 0, "7", 0x37},
    {0, 0, "8", 0x38},
    {0, 0, "9", 0x39},
    {0, 0, "+", 0x00},
    {0, 0, "-", 0x00},
    {0, 0, ".", 0x00},
    {0, 0, "Del", 0x00},
    {0, 0, "Bac", 0x00},
    {0, 0, "Ent", 0x00}
};

extern const _tagMenuAttr MenuAttr;

typedef struct {
    unsigned char Bflag,Buffer[10];
} CAN_MSG;
CAN_MSG BuffCAN[200];
int MsgCount=0,rMsgCount=0;

// 如下增加的代码是最新的优化部分加入
// DateTime: 2007-04-04 15:00 完全处理所有的鼠标事件
#define MOUSE_CLICKEVT_LEN  50
typedef struct {
    int x;
    int y;
    char flag;
} tagUsrClickEvtList;
static int rUsrClickEvtList=0,wUsrClickEvtList=0;
tagUsrClickEvtList UsrClickEvtList[MOUSE_CLICKEVT_LEN];
// 默认还没有按下左按钮 为了仅捕捉第一次按键
// UsrLeftKeyTms记录按钮按下的事件 =1刚开始按下; 当松开按键时 请=0.
// 初始坐标存储值 (UsrLeftKeyX,UsrLeftKeyY)=(0,0).
static int UsrLeftKeyX=0,UsrLeftKeyY=0;
static int UsrLeftKeyTms=0;

unsigned OldProcSeg,OldProcOff,OldMask;
int ClickCol,ClickRow,MouseClickFlag=0;
int OldMouseCol,OldMouseRow,MouseFlag=0,CursorDrawing=0;
unsigned char far *MouseImageBuffer;

/* 8*15 英文字库掩码
   本来大小为8*16; 由于最下一行都是0x00 所以裁剪掉 节省了90个字节的内存 */
const unsigned char LibraryASC[] = {
    0x00,0x00,0x18,0x3c,0x3c,0x3c,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00, //[!]
    0x00,0x66,0x66,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //["]
    0x00,0x00,0x00,0x6c,0x6c,0xfe,0x6c,0x6c,0x6c,0xfe,0x6c,0x6c,0x00,0x00,0x00, //[#]
    0x18,0x18,0x7c,0xc6,0xc2,0xc0,0x7c,0x06,0x06,0x86,0xc6,0x7c,0x18,0x18,0x00, //[$]
    0x00,0x00,0x00,0x00,0xc2,0xc6,0x0c,0x18,0x30,0x60,0xc6,0x86,0x00,0x00,0x00, //[%]
    0x00,0x00,0x38,0x6c,0x6c,0x38,0x76,0xdc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00, //[&]
    0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //[']
    0x00,0x00,0x0c,0x18,0x30,0x30,0x30,0x30,0x30,0x30,0x18,0x0c,0x00,0x00,0x00, //[(]
    0x00,0x00,0x30,0x18,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x18,0x30,0x00,0x00,0x00, //[)]
    0x00,0x00,0x00,0x00,0x00,0x66,0x3c,0xff,0x3c,0x66,0x00,0x00,0x00,0x00,0x00, //[*]
    0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x7e,0x18,0x18,0x00,0x00,0x00,0x00,0x00, //[+]
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x00,0x00, //[,]
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //[-]
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00, //[.]
    0x00,0x00,0x00,0x00,0x02,0x06,0x0c,0x18,0x30,0x60,0xc0,0x80,0x00,0x00,0x00, //[/]
    0x00,0x00,0x38,0x6c,0xc6,0xc6,0xd6,0xd6,0xc6,0xc6,0x6c,0x38,0x00,0x00,0x00, //[0]
    0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x7e,0x00,0x00,0x00, //[1]
    0x00,0x00,0x7c,0xc6,0x06,0x0c,0x18,0x30,0x60,0xc0,0xc6,0xfe,0x00,0x00,0x00, //[2]
    0x00,0x00,0x7c,0xc6,0x06,0x06,0x3c,0x06,0x06,0x06,0xc6,0x7c,0x00,0x00,0x00, //[3]
    0x00,0x00,0x0c,0x1c,0x3c,0x6c,0xcc,0xfe,0x0c,0x0c,0x0c,0x1e,0x00,0x00,0x00, //[4]
    0x00,0x00,0xfe,0xc0,0xc0,0xc0,0xfc,0x06,0x06,0x06,0xc6,0x7c,0x00,0x00,0x00, //[5]
    0x00,0x00,0x38,0x60,0xc0,0xc0,0xfc,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00, //[6]
    0x00,0x00,0xfe,0xc6,0x06,0x06,0x0c,0x18,0x30,0x30,0x30,0x30,0x00,0x00,0x00, //[7]
    0x00,0x00,0x7c,0xc6,0xc6,0xc6,0x7c,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00, //[8]
    0x00,0x00,0x7c,0xc6,0xc6,0xc6,0x7e,0x06,0x06,0x06,0x0c,0x78,0x00,0x00,0x00, //[9]
    0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00, //[:]
    0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00, //[;]
    0x00,0x00,0x00,0x06,0x0c,0x18,0x30,0x60,0x30,0x18,0x0c,0x06,0x00,0x00,0x00, //[<]
    0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00, //[=]
    0x00,0x00,0x00,0x60,0x30,0x18,0x0c,0x06,0x0c,0x18,0x30,0x60,0x00,0x00,0x00, //[>]
    0x00,0x00,0x7c,0xc6,0xc6,0x0c,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00, //[?]
    0x00,0x00,0x00,0x7c,0xc6,0xc6,0xde,0xde,0xde,0xdc,0xc0,0x7c,0x00,0x00,0x00, //[@]
    0x00,0x00,0x10,0x38,0x6c,0xc6,0xc6,0xfe,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00, //[A]
    0x00,0x00,0xfc,0x66,0x66,0x66,0x7c,0x66,0x66,0x66,0x66,0xfc,0x00,0x00,0x00, //[B]
    0x00,0x00,0x3c,0x66,0xc2,0xc0,0xc0,0xc0,0xc0,0xc2,0x66,0x3c,0x00,0x00,0x00, //[C]
    0x00,0x00,0xf8,0x6c,0x66,0x66,0x66,0x66,0x66,0x66,0x6c,0xf8,0x00,0x00,0x00, //[D]
    0x00,0x00,0xfe,0x66,0x62,0x68,0x78,0x68,0x60,0x62,0x66,0xfe,0x00,0x00,0x00, //[E]
    0x00,0x00,0xfe,0x66,0x62,0x68,0x78,0x68,0x60,0x60,0x60,0xf0,0x00,0x00,0x00, //[F]
    0x00,0x00,0x3c,0x66,0xc2,0xc0,0xc0,0xde,0xc6,0xc6,0x66,0x3a,0x00,0x00,0x00, //[G]
    0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xfe,0xc6,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00, //[H]
    0x00,0x00,0x3c,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00, //[I]
    0x00,0x00,0x1e,0x0c,0x0c,0x0c,0x0c,0x0c,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00, //[J]
    0x00,0x00,0xe6,0x66,0x66,0x6c,0x78,0x78,0x6c,0x66,0x66,0xe6,0x00,0x00,0x00, //[K]
    0x00,0x00,0xf0,0x60,0x60,0x60,0x60,0x60,0x60,0x62,0x66,0xfe,0x00,0x00,0x00, //[L]
    0x00,0x00,0xc6,0xee,0xfe,0xfe,0xd6,0xc6,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00, //[M]
    0x00,0x00,0xc6,0xe6,0xf6,0xfe,0xde,0xce,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00, //[N]
    0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00, //[O]
    0x00,0x00,0xfc,0x66,0x66,0x66,0x7c,0x60,0x60,0x60,0x60,0xf0,0x00,0x00,0x00, //[P]
    0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xd6,0xde,0x7c,0x0c,0x0e,0x00, //[Q]
    0x00,0x00,0xfc,0x66,0x66,0x66,0x7c,0x6c,0x66,0x66,0x66,0xe6,0x00,0x00,0x00, //[R]
    0x00,0x00,0x7c,0xc6,0xc6,0x60,0x38,0x0c,0x06,0xc6,0xc6,0x7c,0x00,0x00,0x00, //[S]
    0x00,0x00,0x7e,0x7e,0x5a,0x18,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00, //[T]
    0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00, //[U]
    0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x6c,0x38,0x10,0x00,0x00,0x00, //[V]
    0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xd6,0xd6,0xd6,0xfe,0xee,0x6c,0x00,0x00,0x00, //[W]
    0x00,0x00,0xc6,0xc6,0x6c,0x7c,0x38,0x38,0x7c,0x6c,0xc6,0xc6,0x00,0x00,0x00, //[X]
    0x00,0x00,0x66,0x66,0x66,0x66,0x3c,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00, //[Y]
    0x00,0x00,0xfe,0xc6,0x86,0x0c,0x18,0x30,0x60,0xc2,0xc6,0xfe,0x00,0x00,0x00, //[Z]
    0x00,0x00,0x3c,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3c,0x00,0x00,0x00, //[[]
    0x00,0x00,0x00,0x80,0xc0,0xe0,0x70,0x38,0x1c,0x0e,0x06,0x02,0x00,0x00,0x00, //[\]
    0x00,0x00,0x3c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x3c,0x00,0x00,0x00, //[]]
    0x10,0x38,0x6c,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //[^]
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00, //[_]
    0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //[`]
    0x00,0x00,0x00,0x00,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00, //[a]
    0x00,0x00,0xe0,0x60,0x60,0x78,0x6c,0x66,0x66,0x66,0x66,0x7c,0x00,0x00,0x00, //[b]
    0x00,0x00,0x00,0x00,0x00,0x7c,0xc6,0xc0,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00, //[c]
    0x00,0x00,0x1c,0x0c,0x0c,0x3c,0x6c,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00, //[d]
    0x00,0x00,0x00,0x00,0x00,0x7c,0xc6,0xfe,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00, //[e]
    0x00,0x00,0x38,0x6c,0x64,0x60,0xf0,0x60,0x60,0x60,0x60,0xf0,0x00,0x00,0x00, //[f]
    0x00,0x00,0x00,0x00,0x00,0x76,0xcc,0xcc,0xcc,0xcc,0xcc,0x7c,0x0c,0xcc,0x78, //[g]
    0x00,0x00,0xe0,0x60,0x60,0x6c,0x76,0x66,0x66,0x66,0x66,0xe6,0x00,0x00,0x00, //[h]
    0x00,0x00,0x18,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00, //[i]
    0x00,0x00,0x06,0x06,0x00,0x0e,0x06,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3c, //[j]
    0x00,0x00,0xe0,0x60,0x60,0x66,0x6c,0x78,0x78,0x6c,0x66,0xe6,0x00,0x00,0x00, //[k]
    0x00,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00, //[l]
    0x00,0x00,0x00,0x00,0x00,0xec,0xfe,0xd6,0xd6,0xd6,0xd6,0xc6,0x00,0x00,0x00, //[m]
    0x00,0x00,0x00,0x00,0x00,0xdc,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00, //[n]
    0x00,0x00,0x00,0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00, //[o]
    0x00,0x00,0x00,0x00,0x00,0xdc,0x66,0x66,0x66,0x66,0x66,0x7c,0x60,0x60,0xf0, //[p]
    0x00,0x00,0x00,0x00,0x00,0x76,0xcc,0xcc,0xcc,0xcc,0xcc,0x7c,0x0c,0x0c,0x1e, //[q]
    0x00,0x00,0x00,0x00,0x00,0xdc,0x76,0x66,0x60,0x60,0x60,0xf0,0x00,0x00,0x00, //[r]
    0x00,0x00,0x00,0x00,0x00,0x7c,0xc6,0x60,0x38,0x0c,0xc6,0x7c,0x00,0x00,0x00, //[s]
    0x00,0x00,0x10,0x30,0x30,0xfc,0x30,0x30,0x30,0x30,0x36,0x1c,0x00,0x00,0x00, //[t]
    0x00,0x00,0x00,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00, //[u]
    0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x3c,0x18,0x00,0x00,0x00, //[v]
    0x00,0x00,0x00,0x00,0x00,0xc6,0xc6,0xd6,0xd6,0xd6,0xfe,0x6c,0x00,0x00,0x00, //[w]
    0x00,0x00,0x00,0x00,0x00,0xc6,0x6c,0x38,0x38,0x38,0x6c,0xc6,0x00,0x00,0x00, //[x]
    0x00,0x00,0x00,0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7e,0x06,0x0c,0xf8, //[y]
    0x00,0x00,0x00,0x00,0x00,0xfe,0xcc,0x18,0x30,0x60,0xc6,0xfe,0x00,0x00,0x00  //[z]
};

extern int BitsOfPixel;
extern FILE *fpGB16;
extern FILE *fpICO2424,*fpICO3232,*fpICO8840;
extern unsigned char far *lpImageData,*lpImageMask;

extern tagVarST3000 VarST3000;
extern int ClickCol,ClickRow,MouseClickFlag;

/*
void ___VESAFUNCs___(void)
*/
/***
Func: GetVESA Mode Information
Return:
    1-success; 0-failed
***/
int GetVESAMode(int mode)
{
    union REGS in,out;
    struct SREGS segs;
    char far *modeInfo = (char far *)&VesaModeInfoBlock;
    if( mode<0x100 ) {   return 0;}
    in.x.ax = 0x4F01;
    in.x.cx = mode;
    in.x.di = FP_OFF(modeInfo);
    segs.es = FP_SEG(modeInfo);
    int86x(0x10, &in, &out, &segs);
    if( out.x.ax==0x004f ) {   return 1;}
    return 0;
}

/***
Func: GetVESA  Head Information
Return:
    1-success; 0-failed
***/
int GetVESAInfo(void)
{
    union REGS in,out;
    struct SREGS segs;
    char far *VbeInfo = (char far *)&vesainfoblock;
    in.x.ax = 0x4F00;
    in.x.di = FP_OFF(VbeInfo);
    segs.es = FP_SEG(VbeInfo);
    int86x(0x10, &in, &out, &segs);
    if( out.x.ax==0x004f ) {   return 1;}
    return 0;
}

/***
Func: Set VESA-Graphcs to Special MODE
Parameters:
    -mode; mode index
***/
void SetVESAMode(int mode)
{
    asm {
        PUSH AX
        PUSH BX
        MOV AX, 0x4F02
        MOV BX, mode
        INT 0x10
        POP BX
        POP AX
    }
}

/***
Func: Initialize SVGA 1024x768x32 TureColor
***/
int InitVESA(void)
{
    int Bfound=0;
    unsigned far *p;
    memset(&g_graphatt, 0, sizeof(graphatt));
    if( !GetVESAInfo() ) {   return 0;}
    for(p=vesainfoblock.VideoModePtr; *p!=0xffff; p++)
    {
        if( GetVESAMode(*p) &&
            VesaModeInfoBlock.XResolution==0x0400 &&
            VesaModeInfoBlock.YResolution==0x0300 &&
            VesaModeInfoBlock.BitsPerPixel==0x0020 &&
            VesaModeInfoBlock.BytesPerScanLine==0x1000 &&
            VesaModeInfoBlock.MemoryModel==0x06 &&
            VesaModeInfoBlock.NumberOfPlanes==1 )
        {   Bfound=1;}
        if( Bfound )
        {
            g_graphatt.nBytesPerLine=0x1000;
//            g_graphatt.dwPhysBasePtr=(unsigned long)(VesaModeInfoBlock.VideoPtr);
            g_graphatt.nCurBank=-1;
            g_nBankShift=0;
            while( (unsigned)(64>>g_nBankShift)!=VesaModeInfoBlock.WinGranularity )
            {   g_nBankShift++;}
            LocalScrPtr=(unsigned char far*)(((unsigned long)0xa000)<<16);
            SetVESAMode(*p);
            BitsOfPixel=4;
            return 1;
        }
    }
    return 0;
}

/***
Func: End VESA-Graphics mode
***/
void EndVESA(void)
{
    asm {
        PUSH AX
        PUSH BX
        PUSH CX
        PUSH DX
        MOV AX, 3
        INT 0x10
        POP DX
        POP CX
        POP BX
        POP AX
    };
    memset(&g_graphatt, 0, sizeof(graphatt));
}

/***
Func: Set MemBank for VESA Graphics
Parameters:
    -bank ; bank index;
***/
void SetBANK(int bank)
{
    if( bank == g_graphatt.nCurBank ) {   return;}
    g_graphatt.nCurBank = bank;
    bank <<= g_nBankShift;
    asm{
        PUSH AX
        PUSH BX
        PUSH CX
        PUSH DX
        MOV AX, 0x4F05
        MOV BX, 0
        MOV DX, bank
        INT 0x10
        POP DX
        POP CX
        POP BX
        POP AX
    };
}

/***
Func: Pixel
Parameters:
    -x,y ;  position of pixel;
    -r,g,b ;    color of pixel;
***/
void PutPixel(int x, int y, int r, int g, int b)
{
    // assert : GrahpicsMode = 32BIT-1024*768
    unsigned long addr=((unsigned long)y<<12) + ((unsigned long)x<<2);//y*4096 + x*4
    CursorDrawing=1;
    SetBANK((int)(addr>>16));
    *(LocalScrPtr+(addr&0xffff))=(char)r; addr++;
    *(LocalScrPtr+(addr&0xffff))=(char)g; addr++;
    *(LocalScrPtr+(addr&0xffff))=(char)b;
    currx=x; curry=y;
    CursorDrawing=0;
}

/***
Func: fill pixel sub for FillPoly
Parameters:
    -r,g,b; color of pixel.
***/
void _FillPixel(int r, int g, int b)
{
    int i,j,k,x,y,m,n;
    for(i=0;filltemp[(count_line-1)%3][i]!=0xffff;i+=2)
    {
        x=filltemp[(count_line-1)%3][i];
        for(j=0;filltemp[count_line%3][j]!=0xffff;j+=2)
        {
            if(filltemp[(count_line-1)%3][i]==filltemp[count_line%3][j])
            {
                m=filltemp[(count_line-1)%3][i+1];
                n=filltemp[count_line%3][j+1];
                if(m>n)
                {   y=m; m=n; n=y;
                }
                for(y=m+1;y<n;y++)
                {   PutPixel(x,y,r,g,b);}
            }
        }
    }
    for(j=0;filltemp[count_line%3][j]!=0xffff;j+=2)
    {
        x=filltemp[count_line%3][j];
        for(k=0;filltemp[(count_line-2)%3][k]!=0xffff;k+=2)
        {
            if(filltemp[count_line%3][j]==filltemp[(count_line-2)%3][k])
            {
                m=filltemp[count_line%3][j+1];
                n=filltemp[(count_line-2)%3][k+1];
                if( m>n )
                {   y=m; m=n; n=y;}
                for(y=m+1;y<n;y++)
                {   PutPixel(x,y,r,g,b);}
            }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -