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

📄 全屏幕编辑软件的编写(c语言)06.txt

📁 全屏幕编辑软件
💻 TXT
📖 第 1 页 / 共 2 页
字号:
st()       /* 如数组大于 Q1 行,先将下部 Q3 行存到 fp2,再从 fp1 读入 Q3 行 */
{
  int i,j;
  if(oa)  {                          /* 如 fp1 中有记录 */
    if(ss_max>=Q1)  wfp2();          /* 如数组大于Q1行,先将下部Q3 行存到 fp2 */
    mov(0,Q3);                       /* 数组各行后移 Q3 行 */
    fseek(fp1,wra[--oa],SEEK_SET);   /* 移动 fp1 读写指针到读写起点 */
    j=read_from(0,Q3,fp1);           /* 从 fp1 读 Q3 行,写入数组 0 行起 */
    ss_x+=j;                         /* 计算数组行号 */
    ss_max+=j;                       /* 计算编辑数组实用最大行行号 */
  }
}

wfp2()                               /* 写 Q3 行到临时文件 2 */
{
  int i;
  fseek(fp2,wrb[ob],SEEK_SET);       /* 定 fp2 指针到本次读写位置 */
  write_to(ss_max-Q3+1,Q3,fp2);      /* 从数组ss_max-Q3+1行起,写 Q3 行到 fp2 */
  if(xx-ss_x+ss_max==ttl_x) fputc(0,fp2); /* 文末行以 '\0' 定界 */
  wrb[++ob]=ftell(fp2);              /* 记录下一次写起始地址到指针数组wrb[ ] */
  ss_max-=Q3;                        /* 数组实用最大行号相应减少 */
  for(i=ss_max+1;i<QB;i++)
    *ss[i]=0;                        /* 编辑数组后部空行初始化 */
}

int mod()                            /* 测显示模式, 确定显存起始地址 */
{
  int pp;
  unsigned char vmode;
  vmode=peek(0x40,0x49);             /* 测显示方式 */
  if(vmode>3)  {                     /* 如方式为 4 以上 */
    vid=1;                           /* 置 vid=1,调用 BIOS 功能方式 */
    return 1;                        /* 返回 1 */
  }
  else  vid=0;                       /* 否则 vid=0,字符直接写屏方式 */
  mem=(char far *)0xB8000000;        /* 彩显基本区首址 */
  pp=inp(0x3DA);                     /* 读出 3DA 端口值 */
  pp/=0x10;                          /* 取高位字节 */
  if(pp==1)                          /* 如高位字节为 1 */
    mmm=(char far *)0xC0000000;      /* 014 卡扩展区首址 */
  else                               /* 如高位字节不为 1 */
    mmm=(char far *)0xB0000000;      /* CEGA、CVGA卡扩展区首址 */
}

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] 下一页  

write_string(int x,int y,char *p,int attrib)     /* 在指定位置写字符串 p */
{                                    /* x 行坐标,y 列坐标,attlib 显示属性 */
  if(vid) write_string1(x,y,p,attrib);   /* 如为图形方式 */
  else  write_string2(x,y,p,attrib);     /* 如为字符方式 */
}

write_string1(int x,int y,char *p,int attrib)  /* 调用 BIOS 功能显示字符串 */
{
  int i;
  for(i=y;*p;i++)                    /* i 为屏幕显示的列坐标 */
    write_char1(x,i,*p++,attrib);
}

write_string2(int x,int y,char *p,int attrib) /* 直接写屏方式显示字符串 */
{
  int i;
  unsigned int vh,vl;
  char far *v,far *u;
  u=mmm+(80*x+y)*2;                     /* 在扩展区绝对地址 */
  v=mem+(80*x+y)*2;                     /* 在基本区绝对地址 */
  while(*p)  {                          /* 字符为真则循环 */
    vh=*p++;                            /* 取出一字节 */
    if(vh<0xA1)  {                      /* 如为半角字符 */
      *v++=vh;                          /* 该字节写入基本区,基本区地址指针加1 */
      *u++=0;                           /* 扩展区填 '\0',指针加 1 */
      *v++=attrib;                      /* 基本区填入属性值,地址指针加 1 */
      *u++=0;                           /* 扩展区填 '\0',指针加 1 */
    }
    else  {                             /* 如为全角字符 */
      vl=*p++;                          /* 再取出一字节 */
      i=vh*0x100+vl-0xA0A0;             /* 计算区位码 */
      vh=i/0x100;                       /* 求区码 */
      vl=i-vh*0x100;                    /* 求位码 */
      if(vh<0x0F)  _DX=vh*94+vl+255;    /* 1-9 区地址码 */
      else  _DX=(vh-6)*94+vl+255;       /* 16 以上区地址码 */
      *u++=_DH|0x40;            /* 高位显示码写入扩展区,扩展区地址指针加 1 */
      *v++=_DL;                 /* 低位显示码写入基本区基本区地址指针加 1 */
      *u++=0;                           /* 扩展区填 '\0',指针加 1 */
      *v++=attrib;                      /* 字符属性写入基本区,基本区指针加 1 */
      *u++=0;                           /* 基本区和扩展区后两字节填 '\0' */
      *v++=0;
      *u++=0;
      *v++=0;
    }
  }
}
write_char(int x,int y,char ch,int attrib)  /* 写一半角字符 ch */
{                                     /* x 行坐标,y 列坐标,attlib 显示属性 */
  if(vid)   write_char1(x,y,ch,attrib);     /* 如为图形方式 */
  else    write_char2(x,y,ch,attrib);       /* 如为字符方式 */
}

write_char1(int x,int y,char ch,int attrib) /* 调用 BIOS 功能写一半角字符 */
{
  goto_xy(x,y);                             /* 定光标位置 */
  r.h.ah=9;                                 /* 第 9 号功能 */
  r.h.bh=0;                                 /* 显示 0 页 */
  r.x.cx=1;                                 /* 显示 1 次 */
  r.h.al=ch;                                /* 字符放入 AL 寄存器 */
  r.h.bl=attrib;                            /* 属性放入 AH 寄存器 */
  int86(0x10,&r,&r);                        /* 用10H 中断 9 号功能写屏 */
}

write_char2(int x,int y,char ch,int attrib) /* 直接写屏显示一半角字符 */
{
  char far *v, far *w;
  v=mem+x*160+y*2;                          /* 计算基本区写入地址 */
  w=mmm+x*160+y*2;                          /* 计算扩展区写入地址 */
  *v++=ch;                                  /* 字符 ASCII 码写入基本区 */
  *w++=0;                                   /* 扩展区不用,填 '\0' */
  *v=attrib;                                /* 字符属性写入基本区 */
  *w=0;                                     /* 扩展区不用,填 '\0' */
}

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] 下一页  

write_space(int vx,int vy,int k,int att)    /* 显示一串空格 */
{                            /* vx 行坐标,vy 列坐标,k 空格数,att 显示属性 */
  int i;
  for(i=vy;i<vy+k;i++) write_char(vx,i,32,att); /* 从 vy 到 vy+k-1,显示空格 */
}

roll_scr_up(int a,int b)         /* 向上滚屏 */
{
  r.x.ax=0x0601;                 /* 第六号功能,上滚一行 */
  r.h.ch=a;                      /* 左上角行坐标 */
  r.h.cl=0;                      /* 左上角列坐标 */
  r.h.dh=b;                      /* 右下角行坐标 */
  r.h.dl=FH;                     /* 右下角列坐标 */
  r.h.bh=TEXT_COLOR;             /* 字符属性 */
  int86(0x10,&r,&r);             /* 调用 INT10H 中断 */
}


roll_scr_down(int a,int b)       /* 向下滚屏 */
{
  r.x.ax=0x0701;                 /* 第七号功能,下滚一行 */
  r.h.ch=a;                      /* 右上角行坐标 */
  r.h.cl=0;                      /* 右上角列坐标 */
  r.h.dh=b;                      /* 左下角行坐标 */
  r.h.dl=FH;                     /* 左下角列坐标 */
  r.h.bh=TEXT_COLOR;             /* 字符属性 */
  int86(0x10,&r,&r);             /* 调用 INT10H 中断 */
  disp(ss_x,x);                  /* 当前行补显一行 */
}

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] 下一页  

goto_xy(int vx,int vy)           /* 定位光标 */
{
  r.h.ah=2;                      /* 第 2 号功能 */
  r.h.dl=vy;                     /* 光标的列坐标 */
  r.h.dh=vx;                     /* 光标的行坐标 */
  r.h.bh=0;                      /* 光标在 0 页 */
  int86(0x10,&r,&r);             /* 调用 INT10H 中断 */
}

clss(int a,int b)                /* 清屏 */
{
  r.x.ax=0x0600;                 /* 第 6 号功能 */
  r.x.bx=0x0700;                 /* 属性 */
  r.h.ch=a;                      /* 左上角行坐标 */
  r.h.cl=0;                      /* 左上角列坐标 */
  r.h.dh=b;                      /* 右下角行坐标 */
  r.h.dl=79;                     /* 右下角列坐标 */
  int86(0x10,&r,&r);             /* 调INT10中断 */
}

disp(int a,int i)                     /* 显示行,a 数组行号,i 屏幕行坐标 */
{
  char u=0;
  unsigned char *s;
  int q,j,n,g,k,jv;
  long ux;
  k=m*BP;                             /* 本屏首列的列号 */
  s=malloc(HC);                       /* 给 s 分配内存 */
  strcpy(s,ss[a]);                    /* 将要显示的文本行拷入 s */
  g=strlen(s);                        /* 测字符串长 */
  if(*(s+g-1)==0x0A)  g-=2;           /* 如串尾为回车换行符,串长减 2 */
  n=(g>ZS+k)?(ZS+k):g;                /* 如串尾在以后屏, 至串尾字符数取本行
                                          前行字符数之和,否则取字符串长 */
  if(g<=k)  *s=0;                     /* 如字符串尾在前面屏, 本屏为空串 */
  else {                              /* 如字符串尾不在前面屏 */
    for(j=0;j<n;j++) {               
      if(*(s+j)>0xA0)  u++;           /* 计算汉字字节数 */
      if(m && j==k-1 && u%2) {        /* 如本屏第一字节是汉字后半字节 */
        *(s+k)=32;                    /* 本屏第一字节用空格代替 */
        u++;                          /* 汉字字节数增 1 */

⌨️ 快捷键说明

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