2010年10月15日 星期五

ANSI

可惜的是,現在的WIN系統不能用這種方法了

http://140.117.11.2/txtVersion/treasure/asciiart/M.855729367.D/M.1006196873.A/M.1006196926.B.html

發信人: ufo (碼賽克之王)    看板:asciiart
日期: Mon Apr 22 17:00:29 1996
標題: 轉貼ANSI制做


ANSI 的使用方法

一.首先要先把 ANSI.SYS 裝置到 CONFIG.SYS
例.
 A>TYPE CONFIG.SYS
   DEVICE = ?:\WINDOWS\system32\ANSI.SYS
            └──────>? 為磁碟機路徑



二.ANSI 的指令
   
   I.游標控制
┌──────┬──────────────────────────────┐
│控  制  碼  │   說                                                 明    │
├──────┼──────────────────────────────┤
│[X;Yf       │ 將游標移至第 X 列(line),第 Y 行(Column)的位置              │
│[X;YH       │                                                            │
├──────┼──────────────────────────────┤
│[nA         │ 游標上移 n 列(line),<已至螢幕頂端則無效>                   │
├──────┼──────────────────────────────┤
│[nB         │ 游標下移 n 列(line),<已至螢幕底端則無效>                   │
├──────┼──────────────────────────────┤
│[nC         │ 游標向右移 n 列(line),<已至螢幕最右則無效>                 │
├──────┼──────────────────────────────┤
│[nD         │ 游標向左移 n 列(line),<已至螢幕最左則無效>                 │
├──────┼──────────────────────────────┤
│[6n         │ 報告游標位置                                               │
├──────┼──────────────────────────────┤
│[s          │ 保存目前游標位置                                           │
├──────┼──────────────────────────────┤
│[u          │ 取出保存的游標位置來使用                                   │
└──────┴──────────────────────────────┘
II.螢幕控制
┌──────┬──────────────────────────────┐
│控  制  碼  │   說                                                 明    │
├──────┼──────────────────────────────┤
│[2J         │ 清除螢幕<功能和 DOS 的 CLS 命令相同>                       │
├──────┼──────────────────────────────┤
│[K          │ 將游標位置開始至本列結束的所有字元清除                     │
└──────┴──────────────────────────────┘
III.顯示字元屬性控制
┌──────┬──────────────────────────────┐
│控  制  碼  │   [n1;n2;.......m                                          │
├──────┼──────────────────────────────┤
│說      明  │ 1)設定顯示字元的屬性狀態                                   │
│            │ 2)若有兩個以上的屬性狀態要設定則以分號將代碼               │
│            │   即( n1; n2; .......)隔開                                 │
│            │ 3)除非重新設定,否則原設定之屬性會一直被保留                │
└──────┴──────────────────────────────┘
┌──────┬──────────────────────────────┐
│代       碼 │  意                                                    義  │
├──────┼──────────────────────────────┤
│     0      │ 所有屬性 OFF , 即返回正常顯示模式 (Normal)                 │
│     1      │ 高亮度顯示 (Bright)                                        │
│     4      │ 加上底線 (Underline)                                       │
│     5      │ 閃爍顯示 (Flach)                                           │
│     7      │ 反白顯示 (Inverse)                                         │
│     8      │ 不可見 (Invisable)                                         │
└──────┴──────────────────────────────┘
┌─────────────────────────────────────┐
│ < 底下之代碼僅適用於彩色顯示的系統 >                                     │
│       30                40               黑色                            │
│       31                41               紅色                            │
│       32                42               綠色                            │
│       33                43               黃色                            │
│       34                44               藍色                            │
│       35                45               紫紅色                          │
│       36                46               青藍色                          │
│       37                47               白色                            │
│                                                                          │
│ < 30 - 37 為前景顏色, 40 - 47 為背景顏色 >                               │
└─────────────────────────────────────┘
IV.重訂鍵盤
┌──────┬──────────────────────────────┐
│ 控  制  碼 │  說                                                    明  │
├──────┼──────────────────────────────┤
│[n;mp       │ 將 ASCII 碼為 n的鍵改為 ASCII 碼   m                       │
│[n;'字串';mp│ 將 ASCII 碼為 n的鍵改為字串加上 ASCII 碼 m之字元           │
│            │ (通常  m為控制字元之 ASCII 碼)                             │
└──────┴──────────────────────────────┘

  〔1989,01,24    by  TULAMAN  Sysop :   Tome Tsaur〕 取自於 雜誌
-------------------------------------------------------------------------
             使 用 ANSI 命 令 來  控  制  螢  幕
-------------------------------------------------------------------------
認 識 ANSI.....

   ANSI.SYS 是 一 種 被 稱 為  " 可 以 安 裝 的 驅 動 程 式 "
在 任 何 系 統 下 均 可 用 來 控 制 螢 幕.在 程 式 中 使 用
ANSI.SYS 連 續 命 令 所 產 生 的 輸 出,就 如 同 在 任 何 系 統 之
下 實 際 所 產 生 的 一 樣 理 想  ( 至 少 在 每 個 系 統 下, ANSI.SYS
均 應 被 安 裝 ).
   當 然,有 些 人 認 為 ANSI.SYS 執 行 得 太 慢;它 不 能 你 所 稱 的
視 窗 系 統  (windowing systems) 相 提 並 論.但 是 不 管 你 是 否 喜
歡,ANSI.SYS 是 程 式 撰 寫 員 的 一 個 工 具,ANSI.SYS 可 能 不 是 一
個 期 盼 中 最 偉 大 的 工 具,但 它 卻 是 一 個 最 基 本 的 使 用 工
具.
   大 致 來 說,使 用 ANSI.SYS 是 非 常 容 易 的.當 安 裝 好 之 後
(  從 CONFIG.SYS  檔 案 中 設 "DEVICE=ANSI.SYS"  ),它 會 去 搜 尋 一
組 特 殊 的 字 元,這 組 字 元 就 如 同 一 個 信 號,告 之 後 面 的 字
元 或 字 元 組 此 為 一 個 命 令,然 後 它 會 將 這 組 特 輸 字 元 加
以 取 代,加 入 一 些 適 當 的 命 令 字 元,將 其 放 在 螢 幕 適 當 的
位 置.在 ANSI.SYS 驅 動 程 式 中,僅 僅 包 括 了 一 個  MS-DOS  的 信
號,即 是 " ESC " (XIB) 及 "[" 的 組 合.當 這 組 字 元 被 依 序 送 到
標 準 輸 出 系 統 時,ANSI.SYS 就 會 知 道 有 些 事 情 將 會 發 生 .
-----------------------------------------------------------------------

ANSI 提供下列的服務 :

   ┌────────────────────┐
   ∣ ★ 游標移動 (上 /下 /前 /後)        ∣
   ∣                                        ∣
   ∣ ★ 任意移動游標位置                    ∣
   ∣                                        ∣
   ∣ ★ 報告游標位置                        ∣
   ∣                                        ∣
   ∣ ★ 儲存及取出游標位置                  ∣
   ∣                                        ∣
   ∣ ★ 清除螢幕或一行文字                  ∣
   ∣                                        ∣
   ∣ ★ 顯示模組的控制                      ∣
   └────────────────────┘


表一: ANSI.SYS 命令表
-----------------------------------------------------------------------
| 名稱 |    功   能      |  命 令  |     說           明              |
-----------------------------------------------------------------------
| CUP  | 設定游標位置    | #1;#2H  |                                  |
-----------------------------------------------------------------------
| HVP  | 水平與垂直位置  | #1;#2f  |  #1 表示行 ; #2 表示列           |
-----------------------------------------------------------------------
| CUU  | 游標上移        | #A      |                                  |
-----------------------------------------------------------------------
| CUD  | 游標下移        | #B      |                                  |
-----------------------------------------------------------------------
| CUF  | 游標前移        | #C      |                                  |
-----------------------------------------------------------------------
| CUB  | 游標後移        | #D      |  # 多少個位置(前後左右)要移動    |
-----------------------------------------------------------------------
| DSR  | 狀態報告        | 6n      | 在鍵盤緩衝區中會有一個如下格式   |
|      |                 |         | 的字串ESC[##;##R以及一個CR符號   |
|      |                 |         | , 可以用getch() 來取得它         |
-----------------------------------------------------------------------
| SCP  | 儲存游標位置    | S       |                                  |
-----------------------------------------------------------------------
| RCP  | 恢復游標位置    | u       | (唯有游標先被儲存,才可以恢復游   |
|      |                 |         |  標.連續的儲存游標,後儲存的游    |
|      |                 |         |  標位置將蓋掉先儲存的游標位置)   |
-----------------------------------------------------------------------
| ED   | 清除螢幕        | 2J      | 清除螢幕;移動游標到左上角        |
-----------------------------------------------------------------------
| EL   | 清除一行文字    | K       | 將剩餘一行的文字變成空白;游標    |
|      |                 |         | 移動                             |
-----------------------------------------------------------------------
| SGR  | 設定繪圖解說    | #;,,,l#m| 可接受多個數字參數.設定現在螢幕  |                            |
|      |                 |         | 顏色的屬性 (請參閱例題)          |
-----------------------------------------------------------------------
| SM   | 設定模組        | =#h     |                                  |
-----------------------------------------------------------------------
| RM   | 重新設定模組    | =#l     | #表示顯示模組(0~6).在SM中使用    |
|      |                 |         | 模組7 表示字的捲回是允許的.在    |
|      |                 |         | RM中使用模組7表示字的捲回是不    |
|      |                 |         | 允許的                           |
-----------------------------------------------------------------------

命 令 與 格 式 <-----------
▔▔▔▔▔▔▔
   這 些 命 令 是 憑 藉 著 "escape sequences" 發 送 出 來
的  , 其 格 式 如 " <ESC>[<參數><命令字元> ". 舉 個 例 子
 , 要 將 游 標 移 動 到 某 一 特 定 的 行 與 列 ,所 使 用 的 命 令 字
元 為 "H" , 因 此 ANSI.SYS 要 將 游 標 移 動 到 螢 幕 上 第 16 行 ,
第 10 列 位 置 的 命 令 是 "ESC[16;10H"  (後 面 可 以 放 置 你 所 要
印 出 的 字 串 或 字 元) . 若 是 沒 有 參 數  , 其 格 式 也 是 一 樣
的.例 如 要 清 除 現 在 游 標 所 佔 的 那 一 行  , 你 可 以 使 用 命
令 字 元  "K"  如 下 :  " ESC[K " .  ( 有 幫 助 的 暗 示:ANSI.SYS 對
大 寫 英 文 字 及 小 寫 英 文 字 有 不 同 的 反 應  , 因 此 命 令 字
元 "H"  與 "h" 是 完 全 不 同 的 !)
   表 一 所 顯 示 的 是 全 部 的 ANSI.SYS 命 令  ( 請 注 意  , " EXC[ "
組 合 字 元 要 放 在 每 一 個 命 令 的 前 面 ).
   所 有 ANSI.SYS 命 令  , 都 可 以 放 在  C 的 巨 集 指 令 內,而 這 些
巨 集 指 令 可 以 放 在 一 個 include  檔 案 內.例 1. (ANSI.H) 顯 示 這
些 巨 集 指 令 如 何 被 完 成.它 們 是 從 Augie Hansen 的 Proficient  C
這 本 書 中 所 摘 錄 下 來 的.

功 能 程 式 應 用 <----------
▔▔▔▔▔▔▔▔▔
   以 下 提 供 兩 個 有 用 的 功 能 程 式 在 "例 2." (ANSISTUF.C) 中 ,
get_cur_pos()  程 式 會 將 現 在 游 標 的 位 置 傳 遞 給 呼 叫 程 式
以 及 如 何 去 使 用 ANSI_DSR 的 巨 集 指 令; ansi_installed() 程 式
會 測 試 ANSI.SYS 是 否 已 經 安 裝 好 了.
   你 可 能 已 經 注 意 到 即 定 (default) 的 ANSI.SYS 顏 色 號 碼 和
IBM的 標 準 顏 色 號 碼 有 所 不 同  , 不 用 擔 心  , 當 你 使 用 ANSI.SYS
命 令 時 , ANSI.H 中 的 顏 色 號 碼 將 會 產 生 你 所 期 望 的 顏 色 .
你 可 以 在 ANSI.SGR 程 式 中 選 擇 顯 示"字"的 顏 色 屬 性.

例一 :
▔▔▔
/* ANSI.H */
/*
Description :  Macro definitions for terminal control using ANSI.SYS.
               Includes both cursor positioning and color control.

Author :       Augie Hansen (From "Proficient C", Microsoft Press)
Application :  IBM PC or compitable with turbo C
Published in : TUG Line - Turbo User Group. Box 1510, Poulsbo, WA 98370
*/
/* cursor position */
#define ANSI_CUP(r, c) printf("\x1b[%d;%dH", r, c)
#define ANSI_HVP(r, c) printf("\x1B[%d;%df", r, c)

/* cursor  up, down, forward, back */
#define ANSI_CUU(n)    printf("\x1B[%dA", n)
#define ANSI_CUD(n)    printf("\x1B[%dB", n)
#define ANSI_CUF(n)    printf("\x1B[%dC", n)
#define ANSI_CUB(n)    printf("\x1B[%dD", n)

/* device status report (puts pos'n data in stdin buffer) */
#define ANSI_DSR       printf("\x1B[6n")

/* save and restore cursor position */
#define ANSI_SCP       printf("\x1B[6s")
#define ANSI_RSP       printf("\x1B[6u")

/* erase display and line */
#define ANSI_ED        printf("\x1B[2J")
#define ANSI_EL        printf("\x1B[K")

/* set graphic rendition */
#define ANSI_SGR(a)    printf("\x1B[%dm",a)

/* set and reset modes */
#define ANSI_SM(m)     printf("\x1B[=%dh",m)
#define ANSI_RM(m)     printf("\x1B[=%dl",m)

/* ANSI color codes */

/* special settings */
#define  NORMAL         0
#define  BRIGHT         1
#define  BLINK          5
#define  REVERSE        7
#define  INVISIBLE      8

/* basic colors */
#define  BLACK          0
#define  RED            1
#define  GREEN          2
#define  BROWN          3
#define  BLUE           4
#define  MAGENTA        5
#define  CYAN           6
#define  WHITE          7

/* shift values */
#define  FOREGROUND     30
#define  BACKGROUND     40

/* video modes for SM and RM */
#define  MONO40         0
#define  COLOR40        1
#define  MONO80         2
#define  COLOR80        3
#define  MRESCOLOR      4
#define  MRESMONO       5
#define  MRESMONO       6
#define  WORDWRAP       7
----------------------------------------------------------------------

例二 :
▔▔▔
/* ANSISTUF.C */
/*
Description :  Routines to return the cursor position as an integer
               to the keyboard buffer, and to determine if the ANSI.SYS
               driver has been installed. Uses the macros defined in
               ANSI.H.

Author :       Tim Gentry
Date :         2/2/88
Application :  IBM PC or compatible with Turbo C
Published in : TUG Lines - Turbo User Group. Box 1510, Poulsbo, WA 98370
*/

void get_cur_pos (row, col)
int *row. *col;
{
        /* ANSI_DSR puts the current cursor position into */
        /* the keyboard buffer (stoin) in the format      */
        /*     <esc>[##;##R<cr>                           */
        /* we therefore need to screen out the characters */
        /* <esc>, [, ;, R, and <cr>.                      */
     ANSI_DSR;                  /* request cursor info    */

     getch();                   /* trash the <esc>        */
     getch();                   /* trash the [            */

     *row = 10 * (getch() - '0');
     *row = *row + (getch() - '0');

      getch();                   /* trash the ;            */

      *col = 10 * (getch() - '0');
      *col = *col + (getch() - '0');

      getch();                   /* trash the R            */
      getch();                   /* trash the <cr>         */

      return;
}

int ansi_installed()
{
#define TROW    10
#define TCOL    79
     /* determines if ANSI.SYS is installed by calling     */
     /* ANSI_CUP to position cursor at row 10, col 79,     */
     /* then using the bios video services (hex 10)to get  */
     /* the current video position.  If it's equal to 10,  */
     /* 79 then ANSI.SYS is installed, else it's not.      */
     /* returns 1 if installed, 0 if not.                  */

     union REGS inregs, outregs;

     ANSI_CUP(TROW, TCOL);

     inregs.h.ah = 15;                 /* get video state   */
     int86(0x10, &inregs, &outregs);   /* do the interrupt  */
     inregs.h.ah = 3;                  /* 3 = get cur pos   */
     inregs.h.ah = outregs.h.bh        /* video page number */
     int86(0x10, &inregs, &outregs);   /* do the interrupt  */

     if  (outregs.h.dl  !=TCOL - 1
          || outregs.h.dh  !=TROW - 1) /* do the interrupt  */
          return (0);
     else
          return (1);
}

-----------------------------------------------------------------
....................over..................



如有錯誤,請多指教....   \\///
                       o[O-O]o
                          _

沒有留言:

張貼留言