------------------------------------------------------------------------
                              masters.lib
                              masterm.lib
                              masterc.lib
                              masterl.lib
            なんだかわからんがごちゃごちゃ入ってるライブラリ

            著作・恋塚 昭彦 + 奥田 仁 + 千野 裕司 + 澤 隆司
                             version 0.23a

------------------------------------------------------------------------

*** このライブラリで扱う内容

         なんでもアリ。
        あ、主に NEC  PC-9801シリーズおよびPC/AT互換機+DOS/Vが対
        象です。

*** 利用方法

         このライブラリを利用する場合、プログラムの先頭に次の文
        を書いて下さい。

        C言語版:
           ・MSC ver.6以降, Turbo C以降, Symantec C++ 6.1J  など
             でコンパイルメモリモデルと同じモデルのライブラリを
             使う場合:
                #include "master.h"

           ・small版を強制する場合
                #include "masters.h"

           ・large版を強制する場合
                #include "masterl.h"

           ・compact版を強制する場合
                #include "masterc.h"

           ・medium版を強制する場合
                #include "masterm.h"


*** メモリ管理に関して

         このライブラリのメモリ管理は、起動直後に必要なすべての
        メモリを取得し、その中をやりくりする仕組みになっています。
        (mem_assign_dos 参照)
         そして  DOSから自動的に最大のメモリを取得する(デフォル
        ト)以外にも、 自分で好きな手段で確保したメモリ領域をこの
        ライブラリに引き渡す方法も用意してあります。

         常駐パレットを作成する場合や、子プロセスを起動する場合
        など、ライブラリ内のメモリ管理機構とは別に DOS  からメモ
        リを確保する必要がある場合には、デフォルトの動作以外にな
        るように明示的にライブラリにメモリ領域を指定する必要があ
        る点には注意が必要です。

*** 98とDOS/Vについて
         動作環境を98専用にする場合は、どの関数も直接呼び出せま
        す。
         逆に、DOS/V用や、あるいは98,DOS/V両用にする場合は、 必
        ず get_machine()を最初に実行することにより、
        Machine_State 変数を設定してください。

         98用のソースは、コンパイルオプションに -DMASTER98=0 を
        つけるか、master.hをincludeする前に、#define MASTER98  0
        をつけることにより、多くの関数が DOS/V 用に変換されます。
        運が良ければそのまま移植完了してしまうこともあります(笑)

*** 従来の super.lib 利用者への注意

         まず、メモリ管理に注意してください。
         従来は、super.lib自体が必要に応じて直接DOSからメモリを
        取得していましたが、本バージョンでは最初に必要になった時
        点で自動的に利用可能な DOSのすべてのメモリを占有し、その
        中をやりくりするするようになっています。
         全てのメモリを占有されることを避けるためには、メモリを
        必要とする関数を呼び出す前に、mem_assign()を呼び出して管
        理メモリ領域を明示するようにしてください。

         あ、あとパレットに少し気を付ける必要もありますね。
         super_entry_bfnt()ではハードウェアパレットには設定しま
        せん。必要なタイミングで、palette_show()を実行することで
        はじめて画面に色があらわれることになります。

         master.lib 0.16で、super_put_mitch()関数の名前を
        super_put_clip_8()という名前に変更しました。


*** 従来の BGMLIB 利用者への注意

         voice機能(PCM再生)は削除しました。代わりに  master.lib
        側の pcm_convert, pcm_play を使用してください。

*** 従来の pf.lib 利用者への注意

         ソースの修正が必要です。といっても簡単ですが。
         PFILE * は pf_t に、BFILE * は bf_t に書き換えてくださ
        い。

*** C言語版について

         C言語版には、small,medium,compact,large版がありますが、
        これは対応メモリモデルで分類しています。

        TYPE\MODEL  tiny  small  compact  medium  large  huge
        masters.lib  *1    ○      …       …     …     …
        masterc.lib  *1    ○      ○       …     …     …
        masterm.lib  …    ○      …       ○     …     …
        masterl.lib  …    ○      ○       ○     ○     *2

                                ○:  充分に利用可能
                                …:  利用には多くの知識を要する
                                *1:  farポインタ,割り込みが使え
                                     ません
                                *2:  Microsoft  なら使えますが、
                                     Borland では使えません

         この表を見ると、 large版があればすべてできることがわか
        りますが、 small版にするとポインタや関数呼び出しがnearで
        行われるため、少しだけ速く、小さくなります。 (呼び出し側
        も小さくなります)

        ライブラリルーチンの仮定は、以下のようになっています。

         ・リターン方法:
                small,compact:  retn
                medium,large:   retf
         ・ポインタのサイズ:
                small,medium:   near(offsetのみ)
                compact,large:  far(segment, offset)
         ・保存レジスタ:
                共通:   SI,DI,SS,BP
         ・レジスタの値仮定
                共通:   DS=DGROUP  i-flag=1  d-flag=0
                Nearのみ: CS=_TEXT
         ・スタックセグメントの仮定
                small,medium:   SS=DGROUP (割り込み系は除く)
                compact,large:  SSは自由
         ・パラメータの渡し方:
                先頭から順に PUSHして呼び出す。
                スタックは呼ばれた側が開放します。
         ・終了コードの戻し方:
                16bitなら AXに、32bitなら DX AX にいれて戻す。

*** 表の見方


        ------------------------------------------98N 98H AT DOS-
        <関数名>                                   ○  ○    ○
        ---------------------------------------------<ソースファイル名>-

                98N欄:
                         NEC PC-9801シリーズの、 ノーマルモード
                        で使えるかどうかを表します。
                         ○ならば全てのノーマルモード(または
                            NEC   MSDOSに固有の機能)、  Vならば
                            PC-9801U,V以降となります。
                          空欄ならばノーマルモード固有の機能を利
                          用していませんが、もちろん使えます。

                98H欄:
                         NEC PC-9801シリーズの、 ハイレゾモード
                        で使えるかどうかを表します。
                         ○ならばハイレゾモード固有の機能を使用
                            して対応しています。
                          空欄ならばハイレゾモード固有の機能を利
                          用していませんが、もちろん使えます。

                AT欄:
                         IBM PS/55, PC/AT互換機,  J3100系で使え
                        るかどうかを表します。
                         ○ならば、いずれかの機種に対応していま
                            す。詳しくは関数説明を読んで下さい。
                         ×ならば、いずれにも対応していません。
                         Vならば、VGAが必要です。
                         *ならば、MASTER98=0とマクロ定義してコ
                            ンパイルした場合に、AT互換機用の相当
                            する処理に自動的に置き変わります。
                         空欄ならば、 きっと動くでしょう(おいお
                        い)

                DOS欄:
                         MS-DOS  のどのバージョンに対応している
                        かを表します。
                         5ならば Version 2~5まで対応、 3なら
                        ばVersion 2~3対応となります。
                         ○ならば、 DOSのバージョンには関係ない
                            と思われる機能を利用しています。
                         Vならば、 DOS/V固有の機能を使っていま
                        す。DOS/Vでなければ動作しません。
                         空欄ならば、 DOSの固有機能を利用してい
                        ませんので、 DOSの種類にかかわらず使えま
                        す。

                上記のことから、98N欄と98H欄が共に空欄であれば、
                DOS汎用または8086汎用であることになります。

        表の続きにある説明の左端の記号の意味

        ●      動作説明
        ←      引数の説明
        →      リターン値の説明
        ★      注意事項
        ○      ひとこと(笑)
        △      メモリ管理機構を使用(mem_assign参照)

*** 関数(手続き)一覧

        ● 機種関係

        ○ 機種判定
        get_machine                  起動機種の判定
        get_machine_98               起動機種の判定(98)
        get_machine_at               起動機種の判定(PC/AT)

        ○ CPU関係
        cx486_cacheoff               Cx486のキャッシュ禁止
        cx486_read                   Cx486キャッシュ制御情報の読み込み
        cx486_write                  Cx486キャッシュ制御情報の書き込み
        get_cpu                      CPUの判別

        ● メモリ関係

        ○ メインメモリ関係
        hmem_alloc                   ヒープからのメモリ確保(16bit パラグ
                                     ラフ)
        hmem_allocbyte               ヒープからのメモリ確保(16bit バイト)
        hmem_free                    hmem_*で確保したメモリの開放
        hmem_getid                   hmem_*で確保したブロックの用途を知
                                     る
        hmem_getsize                 hmem_*で確保したブロックの大きさを
                                     知る
        hmem_lallocate               ヒープからのメモリ確保(20bit バイト
                                     単位)
        hmem_maxfree                 hmem_*で確保可能な最大の大きさを知
                                     る
        hmem_realloc                 hmem_*で確保したブロックの大きさ変
                                     更(16bitパラグラフ)
        hmem_reallocbyte             hmem_*で確保したブロックの大きさ変
                                     更(16bitバイト)
        mem_allocate                 DOSメインメモリを上位から確保する
        mem_assign                   呼び出し側が割り当てたメモリを使用
        mem_assign_all               DOSの最大空きメモリブロックを取得
        mem_assign_dos               指定サイズのメモリブロックをDOSから
                                     取得
        mem_free                     DOSメモリブロックの開放
        mem_lallocate                DOSメインメモリを上位から確保する
                                     (long版)
        mem_unassign                 管理メモリ領域を放棄
        smem_lget                    高速メモリ確保(20bit)
        smem_maxfree                 smem_*で確保できる最大量を計算する
        smem_release                 smem_*で確保したメモリの開放
        smem_wget                    高速メモリ確保(16bit)

        ○ LIM EMS 4.0 操作
        ems_allocate                 EMSメモリの確保
        ems_dos_read                 ファイルからEMSへの読込み
        ems_dos_write                EMSからファイルへの書き込み
        ems_enablepageframe          NEC EMSページフレームバンクの操作
        ems_exist                    EMSの存在検査
        ems_findname                 名前からEMSハンドルを探す
        ems_free                     EMSメモリの開放
        ems_getsegment               EMS物理セグメント情報の取得
        ems_maphandlepage            EMSハンドルページのマップ
        ems_movememoryregion         EMSメモリ領域の移動
        ems_read                     EMSメモリを読む
        ems_reallocate               EMSメモリの再確保
        ems_restorepagemap           EMSページマップの復元
        ems_savepagemap              EMSページマップの待避
        ems_setname                  EMSハンドルに名前を設定する
        ems_size                     EMSハンドルの大きさを得る
        ems_space                    EMSの空きバイト数を得る
        ems_write                    EMSメモリに書き込む

        ○ XMS操作
        xms_allocate                 EMBの確保
        xms_exist                    XMSの存在確認と使用開始
        xms_free                     EMBの開放
        xms_maxfree                  EMBの最大フリーブロックの大きさを得
                                     る
        xms_movememory               EMB-メインメモリ間の転送
        xms_reallocate               EMBの再確保
        xms_size                     EMBハンドルの大きさを得る
        xms_space                    EMBの残り総バイト数を得る

        ○ 常駐データ
        resdata_create               常駐データの作成
        resdata_exist                常駐データの検索
        resdata_free                 常駐データの開放

        ○ 文字、文字列処理
        jis_to_sjis                  JISコードをシフトJISに変換
        sjis_to_jis                  シフトJISコードをJISに変換
        str_comma                    整数のカンマ付き文字列化
        str_ctopas                   C文字列をパスカル文字列に書き換える
        str_iskanji2                 文字列の指定位置の漢字2バイト目判定
        str_pastoc                   パスカル文字列をC文字列に書き換える
        str_printf                   sprintfの簡易版

        ● ディスク・ファイル関連

        ○ MS-DOS 単純ファイル操作
        file_append                  ファイルの追加・読み書きオープン
        file_assign_buffer           作業バッファの割り当て
        file_basename                ファイル名部分を見つける
        file_close                   ファイルを閉じる
        file_create                  ファイルの作成・書き込みオープン
        file_delete                  ファイルの削除
        file_eof                     ファイル末尾を読み込んだかどうか
        file_error                   書き込みエラーの有無
        file_exist                   ファイルの存在検査
        file_flush                   作業バッファのフラッシュ
        file_getc                    ファイルからの1バイト読み込み
        file_gets                    指定文字またはサイズまで読み込む
        file_getw                    ファイルからの1ワード読み込み
        file_lread                   ファイルの読み込み(long版)
        file_lsettime                ファイルの最終更新時刻を変更する
                                     (long版)
        file_lwrite                  ファイルの書き込み(long版)
        file_putc                    ファイルへの1バイト書き込み
        file_putw                    ファイルへの1ワード書き込み
        file_read                    ファイルの読み込み
        file_ropen                   ファイルの読み込みオープン
        file_seek                    ファイルポインタの移動
        file_settime                 ファイルの最終更新時刻を変更する
        file_size                    ファイルの大きさを得る
        file_skip_until              指定文字まで読み捨てる
        file_splitpath               パス名を構成要素に分解
        file_splitpath_slash         パス名を構成要素に分解
        file_tell                    ファイルポインタの読み取り
        file_time                    ファイルの最終更新時刻を得る
        file_write                   ファイルの書き込み

        ○ pf.lib バッファされたファイルアクセス
        bcloser                      ファイルの読み込みクローズ
        bclosew                      ファイルの書き込みクローズ
        bdopen                       ファイルハンドルからの再オープン
        bflush                       書き込みファイルバッファのフラッシ
                                     ュ
        bgetc                        ファイルからの1バイト読み込み
        bopenr                       ファイルの読み込みオープン
        bopenw                       ファイルの書き込みオープン
        bputc                        ファイルへの1バイト書き込み
        bputs                        ファイルへの文字列書き込み
        bputw                        ファイルへの2バイト整数書き込み
        bread                        ファイルからの読み込み
        bseek                        ファイルからの読み込み位置を進める
        bseek_                       ファイルからの読み込み位置の移動
        bsetbufsiz                   次回オープン時のファイルバッファの
                                     大きさの指定
        bwrite                       ファイルへの書き込み

        ○ pf.lib parファイルアクセス
        pfcloser                     parファイルのクローズ
        pfend                        pfオートマチックモード終了
        pfgetc                       parファイルから1文字読み込みます
        pfgetw                       parファイルから2バイト整数を読み込
                                     む
        pfopen                       parファイルのオープン
        pfread                       parファイルからの読み込み
        pfrewind                     parファイルの読み込み位置を先頭に戻
                                     す
        pfseek                       parファイルの読み込み位置を進める
        pfstart                      pfオートマチックモード開始
        pftell                       parファイルの読み込み位置を得る

        ○ MS-DOS一般
        dos_absread                  セクタ指定によるディスク読み込み
        dos_abswrite                 セクタ指定によるディスク書き込み
        dos_allocate                 メモリブロックの確保
        dos_axdx                     文字列を渡してMS-DOSを呼ぶ
        dos_chdir                    カレントディレクトリの設定
        dos_close                    ファイルを閉じる
        dos_copy                     ファイルのコピー
        dos_cputp                    高速なコンソールパスカル文字列出力
        dos_cputs                    高速なコンソール文字列出力
        dos_cputs2                   改行文字変換付きコンソール文字列出
                                     力
        dos_create                   ファイルの作成
        dos_filesize                 ファイルサイズの取得
        dos_findfirst                最初に一致するファイルの検索
        dos_findmany                 一度に複数のファイル検索
        dos_findnext                 次に一致するファイルの検索
        dos_free                     メモリブロックの開放
        dos_get_argv0                起動パス名を得る
        dos_getch                    ^Cで止まらない文字入力
        dos_getcwd                   カレントディレクトリの読み出し
        dos_getdiskfree              ディスクの残り容量の読み出し
        dos_getdrive                 カレントドライブを得る
        dos_get_driveinfo            ディスク容量を得る
        dos_getenv                   環境変数を得る
        dos_getkey                   入力を待たない文字入力
        dos_getkey2                  入力を待たない文字入力(2)
        dos_gets                     文字列の入力(編集なし)
        dos_get_verify               ベリファイフラグの読み取り
        dos_ignore_break             ^Cを無視する設定をする
        dos_keyclear                 キーバッファの消去
        dos_makedir                  深いサブディレクトリの作成
        dos_maxfree                  最大空きメモリブロックサイズの取得
        dos_mkdir                    サブディレクトリの作成
        dos_move                     ディレクトリエントリの移動
        dos_putc                     ^Cで止まらない文字出力
        dos_putch                    高速なコンソール文字出力
        dos_putp                     パスカル文字列出力
        dos_puts                     文字列出力
        dos_puts2                    改行文字変換付き文字列出力
        dos_read                     ファイルの読み込み
        dos_rmdir                    サブディレクトリの削除
        dos_ropen                    ファイルの読み込みオープン
        dos_seek                     ファイルポインタの移動
        dos_setbreak                 ブレーク検査フラグの読み取りと設定
        dos_setdrive                 カレントドライブの設定
        dos_setdta                   ディスク転送アドレスの設定
        dos_setvect                  割り込みベクタの読み取りとフック
        dos_set_verify_off           ベリファイOFF
        dos_set_verify_on            ベリファイON
        dos_write                    ファイルの書き込み
        rsl_exist                    RSLの常駐検査
        rsl_linkmode                 シンボリックリンク変換モードの設定
        rsl_readlink                 シンボリックリンクの読み取り

        ● 入力・操作関係

        ○ キーボード関係
        key_back                     キーバッファへの書き戻し
        key_beep_off                 キーバッファフル音の禁止
        key_beep_on                  キーバッファフル音の許可
        key_end                      特殊キー読み取り設定の破棄
        key_pressed                  先行入力の検査
        key_reset                    キーボードインターフェイスのリセッ
                                     ト
        key_scan                     特殊キーの読み取り
        key_sense                    キーの押し下げ状態の取得
        key_sense_bios               BIOSによるキー入力のセンス
        key_set_label                ファンクションキー表示内容の設定
        key_shift                    シフトキー状態の取得
        key_start                    特殊キー読み取りのための準備
        key_wait                     特殊キーの入力待ち
        key_wait_bios                BIOSによるキー入力待ち
        vkey_scan                    待たないキー入力
        vkey_shift                   シフトキー読み取り
        vkey_to_98                   98用キーコードを得る
        vkey_wait                    キー入力待ち

        ○ 日本語FEPの制御
        fep_exist                    日本語FEPの存在判定
        fep_hide                     日本語FEPの非表示
        fep_show                     日本語FEPの表示
        fep_shown                    日本語FEPの表示状態取得

        ○ マウス制御
        mouse_cmoveto                マウスとカーソルの移動
        mouse_get                    マウスの位置とボタンの読み取り
        mouse_int_disable            マウス割り込みの禁止
        mouse_int_enable             マウス割り込みの許可
        mouse_int_end                マウス割り込みの復帰
        mouse_int_start              マウス割り込みの開始
        mouse_proc                   マウス管理ルーチン
        mouse_proc_init              マウス管理の初期化
        mouse_resetrect              マウス管理矩形の初期化
        mouse_setmickey              マウスの移動速度を指定する
        mouse_setrect                マウス管理矩形の設定
        mouse_vend                   VSYNC割り込みマウス終了
        mouse_vstart                 VSYNC割り込みマウス設定
        mouse_iend                   マウス割り込みマウス終了
        mouse_istart                 マウス割り込みマウス設定
        mousex_end                   外部マウスドライバ使用終了
        mousex_iend                  外部優先マウスの使用終了(簡単)
        mousex_istart                外部優先マウスの使用開始(簡単)
        mousex_moveto                外部マウスドライバカーソル位置設定
        mousex_setrect               外部マウスドライバ移動範囲設定
        mousex_start                 外部マウスドライバ使用開始

        ○ ジョイスティック読み取り
        at_js_calibrate              ジョイスティックのキャリブレート
        at_js_get_calibrate          常駐キャリブレート情報取得
        at_js_resptr                 常駐キャリブレート構造体を得る
        at_js_wait                   ジョイスティックのボタン待ち
        js_analog                    アナログジョイスティック読み取り
        js_end                       ジョイスティック読み取り終了
        at_js_end                    ジョイスティック読み取り終了
        js_key                       (キー割り当て変更・内部関数)
        js_key2player                キーボードでの二人操作設定
        at_js_key2player             キーボードでの二人操作設定
        js_keyassign                 キー割当変更
        js_sense                     現在のジョイスティック状態の取得
        at_js_sense                  現在のジョイスティック状態の取得
        js_sense_nokey               現在のジョイスティック状態の取得(キ
                                     ーなし)
        at_js_sense_nokey            現在のジョイスティック状態の取得(キ
                                     ーなし)
        js_sense2                    ジョイスティック読み取り補助
        js_start                     ジョイスティック読み取り開始
        at_js_start                  ジョイスティック読み取り開始

        ● テキスト画面

        ○ PC/AT 画面モード制御
        backup_video_state           復元を前提としたビデオモード取得
        get_video_mode               ビデオモードの取得
        restore_video_state          ビデオモードの復元
        set_video_mode               ビデオモードの設定

        ○ テキスト画面操作
        text_20line                  20行モードにする
        text_25line                  25行モードにする
        text_accesspage              テキスト画面のアクセスページを設定
                                     する
        text_backup                  テキスト画面の保存
        vtext_backup                 テキスト画面の保存
        text_boxfilla                指定範囲の文字属性変更
        vtext_boxfilla               指定範囲の文字属性変更
        text_cemigraph               セミグラフィックを有効にする
        text_clear                   テキスト画面の消去
        vtext_clear                  テキスト画面の消去
        text_cursor_hide             カーソルを消す
        vtext_cursor_hide            カーソルを消す
        _text_cursor_off             BIOSを使用してカーソルを消す
        _text_cursor_on              BIOSを使用してカーソルを表示
        text_cursor_show             カーソルを表示する
        vtext_cursor_show            カーソルを表示する
        text_cursor_shown            カーソルの表示状態を得る
        vtext_cursor_shown           カーソルの表示状態を得る
        text_end                     テキスト画面処理の終了
        text_fillca                  テキスト画面の塗りつぶし
        text_frame                   テキストウィンドウの描画
        vtext_frame                  テキストウィンドウの描画
        text_get                     テキスト画面の領域保存
        vtext_get                    テキスト画面の領域保存
        text_getcurpos               カーソル位置を得る
        vtext_getcurpos              カーソル位置を得る
        text_height                  テキスト画面の行数を得る
        vtext_height                 テキスト画面の行数を得る
        text_hide                    テキスト画面の表示を隠す
        text_locate                  カーソル位置の変更
        vtext_locate                 カーソル位置の変更
        text_preset                  セミグラフィック点消去
        text_pset                    セミグラフィック点描画(属性なし)
        text_pseta                   セミグラフィック点描画(属性つき)
        text_put                     テキスト画面の領域復元
        vtext_put                    テキスト画面の領域復元
        text_putc                    文字の書き込み(属性無し)
        vtext_putc                   文字の書き込み(属性無し)
        text_putca                   文字の書き込み(属性あり)
        vtext_putca                  文字の書き込み(属性あり)
        text_putnp                   文字数指定のパスカル文字列の書き込
                                     み(属性無し)
        text_putnpa                  文字数指定のパスカル文字列の書き込
                                     み(属性あり)
        text_putns                   文字数指定の文字列の書き込み(属性無
                                     し)
        vtext_putns                  文字数指定の文字列の書き込み(属性無
                                     し)
        text_putnsa                  文字数指定の文字列の書き込み(属性あ
                                     り)
        vtext_putnsa                 文字数指定の文字列の書き込み(属性あ
                                     り)
        text_putp                    パスカル文字列の書き込み(属性無し)
        text_putpa                   パスカル文字列の書き込み(属性あり)
        text_puts                    文字列の書き込み(属性無し)
        vtext_puts                   文字列の書き込み(属性無し)
        text_putsa                   文字列の書き込み(属性あり)
        vtext_putsa                  文字列の書き込み(属性あり)
        text_restore                 テキスト画面の復元
        vtext_restore                テキスト画面の復元
        text_roll_area               スクロール範囲の指定
        text_roll_down_c             下スクロール(属性なし)
        vtext_roll_down_c            下スクロール(属性なし)
        text_roll_down_ca            下スクロール(属性つき)
        vtext_roll_down_ca           下スクロール(属性つき)
        text_roll_left_c             左スクロール(属性なし)
        text_roll_left_ca            左スクロール(属性つき)
        text_roll_right_c            右スクロール(属性なし)
        text_roll_right_ca           右スクロール(属性つき)
        text_roll_up_c               上スクロール(属性なし)
        vtext_roll_up_c              上スクロール(属性なし)
        text_roll_up_ca              上スクロール(属性つき)
        vtext_roll_up_ca             上スクロール(属性つき)
        text_setcursor               カーソル形状の変更
        vtext_setcursor              カーソル形状の変更
        text_show                    テキスト画面の表示
        text_shown                   テキスト画面の表示状態を得る
        text_showpage                テキスト画面の表示ページを設定する
        text_smooth                  テキストスムーススクロールのシフト
                                     値を指定
        text_smooth_end              テキストスムーススクロールの終了
        text_smooth_start            テキストスムーススクロール範囲の指
                                     定
        text_start                   テキスト画面処理の開始
        vtext_start                  テキスト画面処理の開始
        text_systemline_hide         画面最下行のシステムラインの消去
        vtext_systemline_hide        画面最下行のシステムラインの消去
        text_systemline_show         画面最下行のシステムラインの表示
        vtext_systemline_show        画面最下行のシステムラインの表示
        text_systemline_shown        画面最下行のシステムラインの表示状
                                     態を得る
        vtext_systemline_shown       画面最下行のシステムラインの表示状
                                     態を得る
        text_vertical                セミグラフィックを無効にする
        text_vputs                   文字列の縦書き(属性なし)
        text_vputsa                  文字列の縦書き(属性あり)
        text_width                   テキスト画面の桁数を得る
        vtext_width                  テキスト画面の桁数を得る
        text_worddota                セミグラフィックの水平16ドットイメ
                                     ージ描画(属性つき)
        TX_GETSIZE                   テキスト領域保存に必要なメモリの大
                                     きさを得る
        vtext_color_98               PC-9801文字属性を PC/AT 用に変換
        vtext_getcursor              カーソル形状を得る
        vtext_font_height            テキストフォントの縦ドット数を得る
        vtext_refresh                仮想テキスト画面の一部の再描画
        vtext_refresh_all            仮想テキスト画面全体を再描画
        vtext_refresh_off            描画非リフレッシュ指定
        vtext_refresh_on             描画即リフレッシュ指定
        vtextx_end                   グラフィック画面テキスト処理の終了
        vtextx_start                 グラフィック画面テキスト処理の開始

        ○ PC-9801 30行BIOS制御
        bios30_exist                 30行BIOS API の存在検査
        bios30_getclock              30行BIOSによるGDCクロックの取得
        bios30_getlimit              30行関連の設定可能行数範囲の取得
        bios30_getline               30行BIOSの管理行数の読み取り
        bios30_getmode               30行BIOSのモード取得
        bios30_getparam              30行BIOSのGDCパラメータの取得
        bios30_getversion            30行BIOS/TTのバージョン取得
        bios30_getvsync              30行BIOSにによるVSYNC周波数の取得
        bios30_lock                  30行BIOSの常駐解除禁止
        bios30_pop                   30行BIOSのモード復元
        bios30_push                  30行BIOSのモード保存
        bios30_setclock              30行BIOSによるGDCクロックの変更
        bios30_setline               30行BIOSに行間なしの時の行数を設定
                                     する
        bios30_setmode               30行BIOSのモード設定
        bios30_tt_exist              30行関連(30bios,TT)の存在検査
        bios30_unlock                30行BIOSの常駐解除許可

        ● グラフィック処理

        ○ グラフィック画面関係
        GB_GETSIZE                   グラフィック領域保存に必要なメモリ
                                     の大きさを得る
        graph_16color                9821 16色モードに設定
        graph_200line                グラフィック画面を200lineに設定する
        graph_24kHz                  9821水平周波数を24kHzに設定する
        graph_256color               9821 256色モードに設定
        graph_31kHz                  9821水平周波数を31kHzに設定する
        graph_400line                グラフィック画面を400lineに設定する
        at98_graph_400line           グラフィック画面を400lineに設定する
        graph_480line                9821画面を480lineモードに設定する
        graph_accesspage             グラフィック画面CPUアクセスページ設
                                     定
        at98_accesspage              グラフィック画面CPUアクセスページ設
                                     定
        graph_analog                 パレットモードをアナログ16色にする
        graph_ank_putc               半角文字の描画
        graph_ank_putp               半角(パスカル)文字列の描画
        graph_ank_puts               半角文字列の描画
        graph_clear                  グラフィック画面の消去
        vga4_clear                   グラフィック画面の消去
        graph_copy_page              グラフィック画面の内容を他のページ
                                     から複写する
        graph_backup                 グラフィック画面(表裏とも)のEMSへの
                                     保存
        graph_bfnt_putc              BFNT文字の描画
        vgc_bfnt_putc                BFNT文字の描画
        graph_bfnt_putp              パスカル文字列描画(BFNT)
        graph_bfnt_puts              BFNT文字列の描画
        vgc_bfnt_puts                BFNT文字列の描画
        graph_byteget                グラフィック画面の領域保存
        vga4_byteget                 グラフィック画面の領域保存
        graph_byteput                グラフィック画面の領域復元
        vga4_byteput                 グラフィック画面の領域復元
        graph_crt                    画面のドットずれ補正解除
        graph_digital                パレットモードをデジタル8色にする
        graph_end                    グラフィック画面一括終了処理
        vga4_end                     グラフィック画面一括終了処理
        graph_enter                  グラフィック画面を消さない初期設定
        graph_extmode                9821拡張グラフィックモードの設定/
                                     取得
        graph_font_put               1文字描画
        vgc_font_put                 1文字描画
        graph_font_putp              パスカル文字列描画
        graph_font_puts              文字列描画
        vgc_font_puts                文字列描画
        graph_gaiji_putc             外字描画
        graph_gaiji_puts             外字文字列描画
        graph_getextmode             9821拡張グラフィックモードの取得
        graph_hide                   グラフィック画面の表示を隠す
        graph_is256color             9821 256色モードかどうか判定
        graph_is31kHz                9821が水平周波数31kHzかどうか得る
        graph_kanji_put              全角文字描画
        graph_kanji_large_put        4倍角漢字描画
        graph_kanji_puts             全角文字列描画
        graph_leave                  グラフィック画面を消さない終了処理
        graph_pack_get_8             パックデータ読み取り(8dot単位)
        vga4_pack_get_8              パックデータ読み取り(8dot単位)
        graph_pack_put_8             パックデータ描画(8dot単位)
        vga4_pack_put_8              パックデータ描画(8dot単位)
        graph_pi_comment_load        Pi画像ファイルのコメント部分読み込
                                     み
        graph_pi_free                Pi画像をメモリから開放
        graph_pi_load_pack           16色Pi画像fileのメモリへの読み込み
                                     (1バイト=2dot)
        graph_plasma                 画面のドットずれ補正
        graph_readdot                グラフィック画面の任意の地点の色を
                                     得る
        vga4_readdot                 グラフィック画面の任意の地点の色を
                                     得る
        graph_restore                EMSに退避したグラフィック画面の復元
        graph_setextmode             9821拡張グラフィックモードの設定
        graph_show                   グラフィック画面を表示する
        graph_shown                  グラフィック画面の表示状態を得る
        graph_showpage               グラフィック画面表示ページ設定
        at98_showpage                グラフィック画面表示ページ設定
        graph_scroll                 グラフィック画面をハードウェアスク
                                     ロールする
        at98_scroll                  グラフィック画面をハードウェアスク
                                     ロールする
        graph_scrollup               グラフィック画面をハードウェア縦ス
                                     クロールする
        graph_start                  16色グラフィック画面一括初期設定
        vga4_start                   16色グラフィック画面一括初期設定
        graph_unpack_get_8           バイト単位データ読み取り(8dot単位)
        vga4_unpack_get_8            バイト単位データ読み取り(8dot単位)
        graph_unpack_large_put_8     バイト単位4倍角データ描画(8dot単位)
        graph_unpack_put_8           バイト単位データ描画(8dot単位)
        vga4_unpack_put_8            バイト単位データ描画(8dot単位)
        graph_wank_putc              圧縮半角文字描画
        graph_wank_putca             圧縮半角文字描画(色指定)
        graph_wank_puts              圧縮半角文字列描画
        graph_wank_putsa             圧縮半角文字列描画(色指定)
        graph_wfont_plane            圧縮半角文字描画のプレーン設定
        graph_wfont_put              圧縮1文字描画
        graph_wfont_puts             圧縮文字列描画
        graph_wkanji_put             圧縮全角文字描画
        graph_wkanji_puts            圧縮全角文字列描画
        graph_xlat_dot               グラフィック画面の点の色を置き換え
                                     る
        graph_xorboxfill             XOR矩形塗り潰し
        mag_free                     MAG画像をメモリから開放
        mag_load_pack                16色MAG画像fileのメモリへの読み込み
        vga4_bfnt_putc               BFNT文字描画(上書き)
        vga4_bfnt_puts               BFNT文字列描画(上書き)
        vga4_byte_move               矩形部分の転送(横8dot単位)
        vga_dc_modify                VGAレジスタのビット操作
        vga_setline                  表示ライン数の設定
        vga_startaddress             表示開始アドレスの設定
        vga_vzoom_off                縦2倍拡大モードOFF
        vga_vzoom_on                 縦2倍拡大モードON
        vgc_kanji_putc               全角文字の描画
        vgc_kanji_puts               全角文字列の描画
        vgc_start                    640x480dot 16色グラフィック設定

        ○ アナログ16色パレット制御
        palette_100                  明るさを100%にする
        dac_100                      明るさを100%にする
        palette_black                画面を真っ黒にする
        dac_black                    画面を真っ黒にする
        palette_black_in             画面を黒からフェードインする
        dac_black_in                 画面を黒からフェードインする
        palette_black_out            画面を黒にフェードアウトする
        dac_black_out                画面を黒にフェードアウトする
        palette_entry_rgb            RGBファイルを読み込む
        palette_init                 パレット変数の初期化
        dac_init                     パレット変数の初期化
        palette_set                  パレットを一つ設定する
        palette_set_all              パレットを全部設定する(256階調)
        palette_set_all_16           パレットを全部設定する(16階調)
        palette_settone              パレットの明るさを設定する
        dac_settone                  パレットの明るさを設定する
        palette_show                 パレット変数の画面への反映
        dac_show                     パレット変数の画面への反映
        palette_show100              パレット変数の画面への反映(100%固定)
        palette_white                画面を真っ白にする
        dac_white                    画面を真っ白にする
        palette_white_in             画面を白からフェードインする
        dac_white_in                 画面を白からフェードインする
        palette_white_out            画面を白にフェードアウトする
        dac_white_out                画面を白にフェードアウトする

        ○ PC-9801 ノーマルモード常駐パレット操作
        respal_create                常駐パレットの作成
        respal_exist                 常駐パレットの存在検査
        respal_free                  常駐パレットの開放
        respal_get_palettes          常駐パレットからパレット変数への読
                                     み込み
        respal_set_palettes          パレット変数から常駐パレットへの書
                                     き込み

        ○ PC-9801 外字処理
        gaiji_backup                 外字の退避
        gaiji_entry_bfnt             外字をBFNTファイルから登録する
        gaiji_putc                   外字で1文字表示(属性なし)
        gaiji_putca                  外字で1文字表示(属性あり)
        gaiji_putni                  外字で数字列を表示(幅指定あり,属性
                                     なし)
        gaiji_putnia                 外字で数字列を表示(幅指定あり,属性
                                     あり)
        gaiji_putp                   外字でパスカル文字列を表示(属性なし)
        gaiji_putpa                  外字でパスカル文字列を表示(属性あり)
        gaiji_puts                   外字で文字列を表示(属性なし)
        gaiji_putsa                  外字で文字列を表示(属性あり)
        gaiji_read                   外字の読み取り(1文字)
        gaiji_read_all               外字の読み取り(256文字)
        gaiji_restore                外字の復元
        gaiji_write                  外字の登録(1文字)
        gaiji_write_all              外字の登録(256文字)

        ○ フォント処理
        font_at_entry_cgrom          システム半角fontを内部半角フォ
                                     ントに登録
        font_at_init                 フォントの読み取り準備
        font_at_init_us              フォントの読み取り準備(強制英語
                                     フォント)
        font_at_read                 フォントの読み取り
        font_entry_bfnt              フォントのBFNTファイルからの登録
        font_entry_cgrom             フォントのCG ROMからの登録
        font_entry_gaiji             フォントの外字からの登録
        font_entry_kcg               フォントの2バイト半角からの登録
        font_read                    フォントの読み取り
        font_write                   フォントの登録
        wfont_entry_bfnt             圧縮フォントのBFNTファイルからの登
                                     録

        ○ グラフィックカーソル
        cursor_hide                  カーソルの表示カウンタ減少
        cursor_init                  カーソル表示状態の初期化
        cursor_moveto                カーソルの移動
        cursor_pattern               カーソルパターンの定義1
        cursor_pattern2              カーソルパターンのMOUSE.COM風定義
        cursor_setpattern            カーソルパターンの定義2
        cursor_show                  カーソルの表示カウンタ増加

        ○ パターン/キャラクタの登録/削除
        super_backup_ems             登録されたパターンをEMSに待避
        super_cancel_pat             パターンの削除
        super_change_erase_pat       消去パターンの変更
        super_clean                  複数パターンの削除
        super_convert_tiny           パターンデータ形式を高速表示用に変
                                     換
        super_dup                    パターンの複製を登録
        super_duplicate              パターンの複製を指定番号に登録
        super_entry_at               パターンを直接登録
        super_entry_char             パターンをキャラクタに登録
        super_entry_pack             パック16色データからパターンを登録
        super_entry_pat              パターンのアドレスを指定して登録
        super_free                   すべてのパターンとキャラクタの削除
        super_free_ems               EMSに待避されたパターンを開放
        super_hrev                   パターンを左右反転
        super_restore_ems            EMSに待避されたパターンを再登録

        ○ BFNT/BFNT+
        bfnt_change_erase_pat        (低)BFNTファイルから消去パターンを
                                     設定
        bfnt_entry_pat               (低)BFNT+ファイルからパターンを登録
        bfnt_extend_header_analysis  (低)BFNT+ファイルから透明色を得る
        bfnt_extend_header_skip      (低)BFNT+ファイルの拡張ヘッダを飛ば
                                     す
        bfnt_header_load             BFNT/BFNT+ファイルのヘッダを読む
        bfnt_header_read             (低)BFNT+ファイルのヘッダを読む
        bfnt_palette_set             (低)BFNT+ファイルからパレット情報を
                                     読む
        bfnt_palette_skip            (低)BFNT+ファイルのパレット情報を無
                                     視する
        fontfile_close               (低)BFNT+ファイルを閉じる
        fontfile_open                (低)BFNT+ファイルを開く
        super_change_erase_bfnt      (高)BFNTファイルから消去パターンを
                                     一括設定
        super_entry_bfnt             (高)BFNT+ファイルからパターンに一括
                                     登録

        ○ パターンの調査
        super_check_entry            パターンの存在検査
        super_getsize_pat            パターンの大きさを得る
        super_getsize_pat_x          パターンの幅を得る
        super_getsize_pat_y          パターンの高さを得る

        ○ パターンの表示(super_put系)
        repair_back                  パターンを裏画面の絵で消去(8dot単位)
        vga4_repair_back             パターンを裏画面の絵で消去(8dot単位)
        slice_put                    パターンの指定ラインを表示(8dot単位)
        super_put                    パターンの表示
        vga4_super_put               パターンの表示
        super_put_8                  パターンの表示(8dot単位)
        vga4_super_put_8             パターンの表示(8dot単位)
        super_put_clip               パターンの表示(y clip)
        vga4_super_put_clip          パターンの表示(y clip)
        super_put_clip_8             パターンの表示(y clip, 8dot単位)
        super_put_tiny               16xndotパターンの高速表示
        super_put_tiny_small         8xndotパターンの高速表示
        super_put_tiny_small_vrev    8xndotパターンの高速表示(上下反転)
        super_put_tiny_vrev          16xndotパターンの高速表示(上下反転)
        super_put_vrev               パターンの表示(上下反転)
        vga4_super_put_vrev          パターンの表示(上下反転)
        super_repair                 パターンを裏画面の絵で消去
        super_roll_put               パターンの表示(画面上下接続)
        vga4_super_roll_put          パターンの表示(画面上下接続)
        super_roll_put_8             パターンの表示(画面上下接続, 8dot単
                                     位)
        super_roll_put_tiny          16x16dotパターンの高速表示(画面上下
                                     接続)

        ○ キャラクタの表示(super_in系)
        repair_out                   キャラクタの除去(8dot単位)
        vga4_repair_out              キャラクタの除去(8dot単位)
        super_in                     キャラクタの表示
        vga4_super_in                キャラクタの表示
        super_out                    キャラクタの除去

        ○ 仮想VRAM系
        virtual_copy                 仮想VRAMの確保と実画面からの転送
        vga4_virtual_copy            仮想VRAMの確保と実画面からの転送
        virtual_free                 仮想VRAMの開放
        virtual_repair               仮想VRAMから実画面へ転送
        vga4_virtual_repair          仮想VRAMから実画面へ転送
        virtual_vram_copy            実画面を仮想VRAMに転送する
        vga4_virtual_vram_copy       実画面を仮想VRAMに転送する

        ○ plane系
        super_roll_put_1plane        パターンを指定プレーンに表示(画面上
                                     下接続)
        super_roll_put_1plane_8      パターンを指定プレーンに表示(8dot単
                                     位, 画面上下接続)
        super_put_1plane             パターンを指定プレーンに表示
        vga4_super_put_1plane        パターンを指定プレーンに表示
        super_put_1plane_8           パターンを指定プレーンに表示(8dot単
                                     位)
        vga4_super_put_1plane_8      パターンを指定プレーンに表示(8dot単
                                     位)

        ○ window系
        super_put_rect               枠クリッピング型パターン表示
        vga4_super_put_rect          枠クリッピング型パターン表示
        super_put_vrev_rect          枠クリッピング型パターン表示(上下反
                                     転)
        vga4_super_put_vrev_rect     枠クリッピング型パターン表示(上下反
                                     転)
        super_put_window             上下クリップ枠に対応したパターン表
                                     示
        super_set_window             上下クリップ枠を設定する

        ○ over_put系
        over_put_8                   パターンの上書き(8dot単位)
        vga4_over_put_8              パターンの上書き(8dot単位)
        over_roll_put_8              パターンの上書き(画面上下接続, 8dot
                                     単位)
        vga4_over_roll_put_8         パターンの上書き(画面上下接続, 8dot
                                     単位)

        ○ 拡大/縮小/変形表示
        over_small_put_8             パターンの2分の1縮小表示(8dot単位)
        super_large_put              パターンの2倍拡大表示
        vga4_super_large_put         パターンの2倍拡大表示
        super_vibra_put              パターンを縦方向に伸縮変形表示
        vga4_super_vibra_put         パターンを縦方向に伸縮変形表示
        super_vibra_put_1plane       パターンを縦方向に揺らして表示(指定
                                     プレーン)
        super_wave_put               パターンを横方向に波状変形表示
        vga4_super_wave_put          パターンを横方向に波状変形表示
        super_wave_put_1plane        パターンを横方向に波状変形表示(指定
                                     プレーン)
        vga4_super_wave_put_1plane   パターンを横方向に波状変形表示(指定
                                     プレーン)
        super_zoom                   パターンの任意拡大表示
        vga4_super_zoom              パターンの任意拡大表示
        super_zoom_put               パターンの拡大/縮小表示
        vga4_super_zoom_put          パターンの拡大/縮小表示
        super_zoom_put_1plane        パターンの拡大/縮小表示(指定プレー
                                     ン)
        super_zoom_v_put             パターンの縦拡大/縮小表示
        super_zoom_v_put_1plane      パターンの縦拡大/縮小表示(指定プレ
                                     ーン)
        vga4_super_zoom_v_put_1plane パターンの縦拡大/縮小表示(指定プレ
                                     ーン)

        ○ 図形描画・設定関係
        grc_setclip                  クリップ枠を設定する

        ○ 図形描画・色設定
        grcg_and                     GRCGの描画モード(AND)設定
        grcg_off                     GRCGのスイッチを切る
        grcg_or                      GRCGの描画モード(OR)設定
        grcg_setcolor                GRCGのモードおよび色設定
        grcg_setmode                 GRCGのモード設定
        grcg_settile_1line           GRCGのモードおよびタイルパターン
                                     (1line)設定
        vgc_setcolor                 描画色の指定

        ○ 図形描画
        grc_clip_line                直線データのクリッピング
        grc_clip_polygon_n           凸/凹多角形データのクリッピング
        grcg_boxfill                 長方形描画
        vgc_boxfill                  長方形描画
        grcg_byteboxfill_x           横8ドット単位の長方形描画
        vgc_byteboxfill_x            横8ドット単位の長方形描画
        grcg_bytemesh_x              横8ドット単位の市松模様塗り潰し
        vgc_bytemesh_x               横8ドット単位の市松模様塗り潰し
        grcg_circle                  円描画
        vgc_circle                   円描画
        grcg_circle_x                円描画(クリッピングなし)
        vgc_circle_x                 円描画(クリッピングなし)
        grcg_circlefill              円塗りつぶし
        vgc_circlefill               円塗りつぶし
        grcg_fill                    クリップ枠全面塗りつぶし
        grcg_hline                   水平線描画
        vgc_hline                    水平線描画
        grcg_line                    直線描画
        vgc_line                     直線描画
        grcg_polygon_c               凸多角形描画
        vgc_polygon_c                凸多角形描画
        grcg_polygon_cx              凸多角形描画(クリッピングなし)
        vgc_polygon_cx               凸多角形描画(クリッピングなし)
        grcg_polygon_vcx             凸多角形描画(クリッピングなし,可変
                                     引数)
        vgc_polygon_vcx              凸多角形描画(クリッピングなし,可変
                                     引数)
        grcg_pset                    点描画
        vgc_pset                     点描画
        grcg_round_boxfill           角の丸い長方形描画
        vgc_round_boxfill            角の丸い長方形描画
        grcg_thick_line              四角いペンによる直線描画
        vgc_thick_line               四角いペンによる直線描画
        grcg_trapezoid               台形塗り潰し
        vgc_trapezoid                台形塗り潰し
        grcg_triangle                三角形塗り潰し
        vgc_triangle                 三角形塗り潰し
        grcg_triangle_x              三角形描画(クリッピングなし)
        grcg_vline                   垂直線描画
        vgc_vline                    垂直線描画
        vgc_byteboxfill_x_pset       長方形塗り潰し(8dot単位,演算なし)
        vgc_line2                    直線描画(ラインスタイルつき)

        ○ PC-9801 GDCによる描画
        gdc_circle                   GDC による円描画
        gdc_line                     GDC による直線描画
        gdc_setaccessplane           VRAM アクセスプレーンの設定
        gdc_setcolor                 描画色と演算の設定
        gdc_setlinestyle             ラインスタイルの設定
        gdc_wait                     GDC 描画完了待ち

        ○ PC-9801 EGC操作
        egc_end                      EGCの終了処理
        egc_off                      EGCをGRCG互換モードに設定する
        egc_on                       EGCを拡張モードに設定する
        egc_scroll_left              EGCによる円筒左スクロール
        egc_scroll_right             EGCによる円筒右スクロール
        egc_selectfg                 P入力にFG色を選択
        egc_selectbg                 P入力にBG色を選択
        egc_selectpat                P入力にパターンレジスタを選択
        egc_setbgcolor               BG色の設定
        egc_setfgcolor               FG色の設定
        egc_setrop                   EGCのモードとROPを設定する
        egc_shift_down               EGCによる部分下スクロール
        egc_shift_down_all           EGCによる下スクロール
        egc_shift_left               EGCによる部分左スクロール
        egc_shift_left_all           EGCによる左スクロール
        egc_shift_right              EGCによる部分右スクロール
        egc_shift_right_all          EGCによる右スクロール
        egc_shift_up                 EGCによる部分上スクロール
        egc_shift_up_all             EGCによる上スクロール
        egc_start                    EGCの初期設定
        has_egc                      EGCが利用できるかどうかの判定

        ● 割り込み

        ○ VSYNC割り込み
        vsync_end                    VSYNC割り込みの使用終了
        vga_vsync_end                VSYNC割り込みの使用終了
        vsync_enter                  VSYNC割り込みのチェイン設定
        vsync_leave                  VSYNC割り込みのチェイン解放
        vsync_proc_reset             VSYNC毎に実行する関数の指定解除
        vsync_proc_set               VSYNC毎に実行する関数の指定
        vsync_start                  VSYNC割り込みの設定およびカウンタリ
                                     セット
        vga_vsync_start              VSYNC割り込みの設定およびカウンタリ
                                     セット
        vsync_wait                   次のVSYNC開始を待つ
        vga_vsync_wait               次のVSYNC開始を待つ

        ○ タイマ割り込み
        timer_end                    タイマ割り込みの使用停止
        timer_start                  タイマ割り込みの設定およびカウンタ
                                     リセット

        ● 音関係

        ○ BEEP音関係
        beep_end                     BEEP音の停止と周波数の復帰
        beep_freq                    BEEP音の周波数を設定する
        vbeep_freq                   BEEP音の周波数を設定する
        beep_off                     BEEP音を止める
        beep_on                      BEEP音を鳴らす

        ○ BEEP PCM関係
        pcm_convert                  PCMデータの変換
        pcm_play                     PCMデータの再生

        ○ BEEP音によるBGMと効果音の再生
        bgm_cont_play                曲の演奏の再開
        bgm_finish                   演奏機能の後始末
        bgm_init                     演奏機能の準備
        bgm_read_data                BGMファイルから曲データを読み込む
        bgm_read_sdata               EFSファイルから効果音データを読み込
                                     む
        bgm_read_status              演奏機能の状態の読み取り
        bgm_repeat_off               曲のくり返し演奏を行わない
        bgm_repeat_on                曲のくり返し演奏を行う
        bgm_select_music             演奏する曲の選択
        bgm_set_mode                 曲演奏/効果音出力動作の可否を設定
        bgm_set_tempo                曲のテンポを設定
        bgm_sound                    効果音出力の開始
        bgm_start_play               曲の演奏の開始
        bgm_stop_play                曲の演奏の中断
        bgm_stop_sound               効果音出力の停止
        bgm_wait_play                演奏中の曲の終了待ち
        bgm_wait_sound               効果音出力の終了待ち

        ● 通信関係

        ○ PC-9801 RS-232C関係
        sio_bit_off                  DTR,RTS,BREAK制御線OFF
        sio_bit_on                   DTR,RTS,BREAK制御線ON
        sio_disable                  (RS-232C割り込み禁止)
        sio_enable                   (RS-232C割り込み許可)
        sio_end                      RS-232C制御ルーチンの開放(1)
        sio_enter                    RS-232C制御ルーチンの初期化(2)
        sio_error_reset              パリティエラーなどのフラグをクリア
                                     する
        sio_getc                     1文字受信
        sio_leave                    RS-232C制御ルーチンの開放(2)
        sio_putc                     1文字送信
        sio_putp                     パスカル文字列送信
        sio_puts                     文字列送信
        sio_read                     データブロック受信
        sio_read_dr                  DR(DSR)信号線読み取り
        sio_read_err                 パリティエラーなどのフラグを読む
        sio_read_signal              CI,CS,CD信号線読み取り
        sio_receivebuf_len           受信バッファ内のバイト数を得る
        sio_sendbuf_len              送信バッファ内のバイト数を得る
        sio_sendbuf_space            送信バッファ内の空きバイト数を得る
        sio_setspeed                 RS-232C速度指定
        sio_start                    RS-232C制御ルーチンの初期化(1)
        sio_write                    データブロック送信

        ● その他

        ○ その他
        Atan8                        アークタンジェント(256度系)
        AtanDeg                      アークタンジェント(360度系)
        BYTE2PARA                    バイト数をパラグラフ数に変換する
        FP2LONG                      farポインタを0:0からのlongオフセッ
                                     トに変換
        FPADD                        farポインタにlongオフセットを加算
        FP_REGULAR                   farポインタの正規化
        FP_REGULAR_SEG               farポインタの正規セグメントを得る
        FP_REGULAR_OFF               farポインタの正規オフセットを得る
        get_ds                       データセグメントを得る
        iatan2                       (x,y)の角度を得る(アークタンジェン
                                     ト)(256度系)
        iatan2deg                    (x,y)の角度を得る(アークタンジェン
                                     ト)(360度系)
        ihypot                       距離
        INPB                         I/Oポートからの読み込み(バイト/ワー
                                     ド)
        INPW                         I/Oポートからの読み込み(バイト/ワー
                                     ド)
        irand                        擬似乱数
        irand_init                   乱数系列の初期化
        isqrt                        平方根
        LONG2FP                      0:0からのlongオフセットをfarポイン
                                     タに変換
        MK_FP                        segment,offsetからfarポインタを合成
        OUTB                         I/Oポートへの書き込み(バイト/ワード)
        OUTW                         I/Oポートへの書き込み(バイト/ワード)
        peekb2                       メモリからの1バイト読み出し
        poke2                        メモリを指定データで埋める
        pokeb2                       メモリへの1バイト書き込み
        SEG2FP                       セグメント値をポインタに変換する
        Sin8                         サイン、コサイン(256度系)
        Cos8                         サイン、コサイン(256度系)
        SinDeg                       サイン、コサイン(360度系)
        CosDeg                       サイン、コサイン(360度系)

==================================================--- Function Reference


------------------------------------------------------------------------
■ 機種関係 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■


------------------------------------------------------------------------
■ 機種判定 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

         master.lib 0.22 からは AT互換機も動作対象としているため、 起動
        された機種を判定して処理を分ける必要があります。

------------------------------------------------------------------------
□ 構造体/グローバル変数

const unsigned Machine_State ;  get_machine()によって設定された機種判別
                                情報

------------------------------------------------------------------------
□ 定数

        ● 機種判定ビットマスク

        ・98関係                ・AT互換機関係
        表記    値              表記          値
        PC9801  0x0020          PC_AT         0x0010

        DESKTOP 0x0001          LANG_US       0x0001
        EPSON   0x0002          PS55          0x0000
        PC_MATE 0x0004          DOSV          0x0002
        HIRESO  0x0008          PC_AX         0x0004
        F_8MHz  0x0040          J3100         0x0006
                                DR_DOS        0x0008
        ・FMR関係               MSDOSV        0x000a
        表記    値              DOSVEXTENTION 0x0040
        FMR     0x0080          ANSISYS       0x0100

        ・全機種
        表記    値
        DOSBOX  0x8000

------------------------------------------------------------------------
□ get_machine - 起動機種の判定

C:      unsigned get_machine(void);

        ------------------------------------------98N 98H AT DOS-
        get_machine                                ○  ○ ○
        -------------------------------------------

                ● 起動された機種を判定します。また、
                   Machine_State変数にも戻り値と同じ値を格納しま
                   す。

                →  PC9801 が ONのとき:    get_machine_98参照
                    PC_AT が ONのとき:     get_machine_at参照
                    どちらもONでないとき:  機種は不明


                ★ PC-9801,PC/AT(互換機,J3100含む) 上での動作のみ
                   想定しています。その他の機種で起動した場合、結
                   果は不定です。機種不明と返されるとは限りません
                   し、ハングアップする可能性もあります。

                ○ 参照:  get_machine_98(), get_machine_at()

------------------------------------------------------------------------
□ get_machine_98 - 起動機種の判定(98)

C:      unsigned get_machine_98(void);

        ------------------------------------------98N 98H AT DOS-
        get_machine_98                             ○  ○ ×
        -------------------------------------------

                ● 起動された 98 の大まかな種別を判定します。また、
                   Machine_State変数にも戻り値と同じ値を格納しま
                   す。

                → 以下のビットの組み合わせ
                    PC9801   (常にON)
                    DESKTOP  (ONなら DESKTOP, OFFなら98NOTE)
                    EPSON    (ONなら EPSON, OFFなら NEC)
                    PC_MATE  (ONなら MATEの480line機能が存在する,
                             OFFならノーマル機)
                    HIRESO   (ONなら現在ハイレゾモード, OFFならノ
                             ーマルモード)
                    F_8MHz   (ONなら 8MHz系、OFFなら5MHz系)
                    DOSBOX   (ONなら Windows  386エンハンストモー
                             ドか WindowsNTか OS/2内, OFFなら普通
                             のDOSから起動された)

                ★ 動作機種が 98 であると断定された状況でのみ正常
                   に動作します。

                例: m = get_machine_98();
                    if ( m & HIRESO ) {
                      /* ハイレゾ用処理 */
                    }

                ○ EPSON note は、以下の 9 機種の場合 note と判断
                   されます。
                    これ以外は、DESK TOP と判断されます。 これら
                   9 機種以外に Note が存在する場合(新製品等)、ご
                   一報ください。追加致します。
                    ただし、追加時に環境を調べる必要がありますの
                   で、その note を触れる環境にある人が連絡して頂
                   かなくては、意味がありません。

                PC286NoteE,     PC286NoteF,     PC386NoteA,
                PC386NoteW,     PC386NoteAE,    PC386NoteWR,
                PC386NoteAR,    PC486NoteAS,    PC486NAV

                ○ 参照:  get_machine(), get_machine_at()

------------------------------------------------------------------------
□ get_machine_at - 起動機種の判定(PC/AT)

C:      unsigned get_machine_at(void);

        ------------------------------------------98N 98H AT DOS-
        get_machine_at                             ×  × ○
        -------------------------------------------

                ● 起動された PC/AT互換機などの大まかな種別を判定
                   します。また、 Machine_State変数にも戻り値と同
                   じ値を格納します。

                → 以下のビットの組み合わせ
                    PC_AT    (常にON)
                    LANG_US  (ONなら英語モード, OFFなら日本語モー
                             ド)
                    PC_TYPE_MASK との論理積の結果によって、以下の
                    ように分類されます。
                      PS55      IBM PS/55
                      DOSV      DOS/V
                      PC_AX     AX
                      J3100     東芝 J3100
                      DR_DOS    DR-DOS
                      MSDOSV    MS-DOS/V
                    DOSBOX   (ONなら Windows  386エンハンストモー
                             ドか WindowsNTか OS/2内, OFFなら普通
                             のDOSから起動された)

                例: m = get_machine_at();
                    if ( m & LANG_US ) {
                      /* 英語モードの処理 */
                    } else {
                      /* 日本語モードの処理 */
                    }
                    if ( (m & PC_TYPE_MASK) == J3100 ) {
                      /* J3100の処理 */
                    }

                ★ 動作機種が PS/55,PC/AT,J3100系であると断定され
                   た状況でのみ正常に動作します。

                ○ 参照:  get_machine(), get_machine_98()


------------------------------------------------------------------------
■ CPU関係 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

        動作しているコンピュータのCPUの判別や、Cyrix製Cx486のキャ
        ッシュ制御などを行います。

------------------------------------------------------------------------
□ 構造体/グローバル変数

struct Cx486CacheInfo {
        unsigned ccr0 ;         キャッシュ制御レジスタ
        unsigned ccr1 ;
        unsigned long ncr[4] ;  キャッシュ禁止領域レジスタ
} ;

------------------------------------------------------------------------
□ 定数

        ● CPUメーカー定数(get_cpu())
        表記            値      意味
        CPU_CYRIX       0x4000  Cyrix Cx486
        CPU_NEC         0x8000  NEC V30

        ● CPUモード定数(get_cpu())
        表記            値      意味
        CPU_V86MODE     0x0100  仮想86モード

        ● CPU種別定数(get_cpu())
        表記            値      意味
        CPU_TYPEMASK    0x00ff  CPU種別のビットマスク
        CPU_TYPE086     0x0000  8086
        CPU_TYPE186     0x0001  80186
        CPU_TYPE286     0x0002  80286
        CPU_TYPE386     0x0003  386
        CPU_TYPE486     0x0004  486
        CPU_TYPEPENTIUM 0x0005  Pentium

------------------------------------------------------------------------
□ cx486_cacheoff - Cx486のキャッシュ禁止

C:      void cx486_cacheoff(void);

        ------------------------------------------98N 98H AT DOS-
        cx486_cacheoff
        --------------------------------------------

                ● Cx486の4GBのメモリ空間すべてをキャッシュ禁止に
                   します。

                ★ Cx486以外で実行してはいけません。  get_cpu()で
                   CPU_CYRIXのビットが立っていることを確認してか
                   ら実行してください。
                ★ 実行環境で動作することを確認してから使ってくだ
                   さい。たとえば、Cx486DLC  +  MEMORY-SERVERIIの
                   cache onの状態ではハングアップしている様子です。

                ○ 参照:  cx486_read(), cx486_write(), get_cpu()

------------------------------------------------------------------------
□ cx486_read - Cx486キャッシュ制御情報の読み込み

C:      void cx486_read( struct Cx486CacheInfo * rec );

        ------------------------------------------98N 98H AT DOS-
        cx486_read
        --------------------------------------------

                ● Cx486の現在のキャッシュ制御レジスタの内容を読
                   み取ります。

                ★ Cx486以外で実行してはいけません。  get_cpu()で
                   CPU_CYRIXのビットが立っていることを確認してか
                   ら実行してください。

                ○ 参照:  cx486_cacheoff(), cx486_write(),
                          get_cpu()

------------------------------------------------------------------------
□ cx486_write - Cx486キャッシュ制御情報の書き込み

C:      void cx486_write( const struct Cx486CacheInfo * rec );

        ------------------------------------------98N 98H AT DOS-
        cx486_write
        --------------------------------------------

                ● Cx486のキャッシュ制御レジスタに書き込みます。

                ★ Cx486以外で実行してはいけません。  get_cpu()で
                   CPU_CYRIXのビットが立っていることを確認してか
                   ら実行してください。
                ★ Cx486DLC + MEMORY-SERVERIIのcache onの状態では
                   ハングアップしている様子です。ううむ。

                ○ 参照:  cx486_cacheoff(), cx486_read(),
                          get_cpu()

------------------------------------------------------------------------
□ get_cpu - CPUの判別

C:      unsigned get_cpu(void);

        ------------------------------------------98N 98H AT DOS-
        get_cpu
        ---------------------------------------------

                ● CPUを判定します。
                   対応しているCPUは、以下の通りです。
                      8086, 80186, V30, V50, 80286, 80386,  i486,
                      Cx486, Pentium

                → cpuval
                   この値から、以下の情報が解ります。
                   ・メーカー
                   (cpuval & CPU_CYRIX) != 0    Cyrix Cx486など
                   (cpuval & CPU_NEC) != 0      NEC V30/V50
                   上記どちらも0                Intel製

                   ・種類
                   (cpuval & CPU_TYPEMASK) ==
                      CPU_TYPE086               8086
                      CPU_TYPE186               80186/V30/V50
                      CPU_TYPE286               80286
                      CPU_TYPE386               80386
                      CPU_TYPE486               i486/Cx486
                      CPU_TYPEPENTIUM           Pentium

                   ・モード
                   (cpuval & CPU_V86MODE) != 0  仮想86モード
                   0のとき                      仮想86以外

                ○ 参照:  cx486_cacheoff(), cx486_read(),
                          cx486_write()


------------------------------------------------------------------------
■ メモリ関係 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■


------------------------------------------------------------------------
■ メインメモリ関係 ■■■■■■■■■■■■■■■■■■■■■■■■■■

         master.lib 0.14以降では、メインメモリ管理は DOS  から随
        時確保していく形ではなく、 最初に一回使用メモリ領域を割り
        当て、その中で割り当て、開放する形が主体となっています。
         そして、これらの内部割り当てメモリ管理処理の中で、 まだ
        最初の割り当てがされていなかった時には自動的に DOS から最
        大のメモリを確保してしまいます。
         このため、従来の  mem_alloc..などの関数の多くは使おうと
        するとメモリ不足になるので、hmem_*や smem_*に置き換えてく
        ださい。

        ● メモリの配置

           smem_*は、 管理メモリブロックの先頭から順次後ろに向か
          って確保されます。
           hmem_*は、 管理メモリブロックの末尾から順次先頭に向か
          って確保されます。
           smem/hmem両者は完全に独立して自由に操作することができ
          ます。

           しかし、 smemの中では必ず最初に確保したものが最後に開
          放される(最後に確保されたものから順に開放される)ように
          なっていなければなりません。

           最後に確保されたsmem_*ブロックを拡大するには、 増分の
          大きさだけsmem_で確保するだけです。これがメモリ不足を返
          さなければ、拡大できたことになります。

           smemもhmemも、 メモリブロックの大きさの単位は16バイト
          (1パラグラフ)です。また、hmemは、メモリブロック一つごと
          に管理構造体として16バイト消費します。

------------------------------------------------------------------------
□ 構造体/グローバル変数

unsigned mem_TopSeg;            管理メモリ領域の先頭セグメント-1
unsigned mem_OutSeg;            管理メモリ領域の末尾の次のセグメ
                                ント
unsigned mem_EndMark;           smem_*の確保ポインタ(末尾位置)
unsigned mem_TopHeap;           hmem_*で確保された最低位置-1
unsigned mem_FirstHole;         hmem_freeで開放された穴の最低位置
                                -1
unsigned mem_MyOwn;             0 なら mem_assign()  で割り当てら
                                れたことを、
                                1 なら
                                mem_assign_dos()/mem_assign_all()
                                で DOS から直接確保されたことを表
                                す。
unsigned mem_AllocID;           hmem_*で確保するときに用途を書き
                                込むための変数。hmem_alloc参照。

------------------------------------------------------------------------
□ 定数

        ● mem_AllocID および hmem_getid()で使用する値
        表記            値  用途
        MEMID_UNKNOWN    0  用途指定なし
        MEMID_FONT       1  font_*で確保
        MEMID_GAIJI      2  gaiji_*で確保
        MEMID_WFONT      3  wfont_*で確保
        MEMID_SUPER      4  super_*で確保
        MEMID_VVRAM      5  virtual_*で確保
        MEMID_BFILE      6  bopenなどで確保
        MEMID_PFILE      7  pfopenで確保
        MEMID_BGM        8  bgm_*で確保(bgm)
        MEMID_EFS        9  bgm_*で確保(efs)
        MEMID_PI        10  graph_pi_*で確保
        MEMID_MAG       11  mag_load_packで確保
        MEMID_TEXTBACK  12  text(vtext)_backupで確保
        MEMID_VTEXTX    13  vtextx_startで確保

------------------------------------------------------------------------
□ hmem_alloc - ヒープからのメモリ確保(16bit パラグラフ)

C:      unsigned hmem_alloc( unsigned parasize );

        ------------------------------------------98N 98H AT DOS-
        hmem_alloc                                           5
        --------------------------------------------

                ● パラグラフサイズを指定して通常のメモリを確保し
                   ます。
                   このメモリブロックは、確保した順と異なった順で
                   開放することができますので、長時間使用するメモ
                   リなどの確保に向いています。
                   開放には必ず hmem_free()を使用してください。

                → 0      管理メモリ領域が足りない
                   0以外  確保できたセグメントアドレス

                ○ この際、メモリブロックの管理情報に mem_AllocID
                   変数の内容を書き込み、そのあとmem_AllocIDを0に
                   します。
                ○ この関数を呼ぶ直前に mem_AllocIDに値を書き込む
                   と、後でメモリブロックから  hmem_getid()で識別
                   することができます。なお、この値は以下の定数が
                   予約されています。
                     MEMID_UNKNOWN, MEMID_FONT, MEMID_GAIJI,
                     MEMID_WFONT, MEMID_SUPER, MEMID_VVRAM,
                     MEMID_BFILE, MEMID_PFILE, MEMID_BGM,
                     MEMID_EFS, MEMID_PI, MEMID_MAG,
                     MEMID_TEXTBACK, MEMID_VTEXTX

                ○ 参照:  hmem_allocbyte(), hmem_free(),
                          hmem_getid(), hmem_getsize(),
                          hmem_lallocate(), hmem_maxfree(),
                          hmem_realloc(), hmem_reallocbyte(),
                          mem_assign()

------------------------------------------------------------------------
□ hmem_allocbyte - ヒープからのメモリ確保(16bit バイト)

C:      unsigned hmem_allocbyte( unsigned bytesize );

        ------------------------------------------98N 98H AT DOS-
        hmem_allocbyte                                       5
        --------------------------------------------

                ● バイト単位でサイズを指定して通常のメモリを確保
                   します。
                   このメモリブロックは、確保した順と異なった順で
                   開放することができますので、長時間使用するメモ
                   リなどの確保に向いています。
                   開放には必ず hmem_free()を使用してください。

                → 0      管理メモリ領域が足りない
                   0以外  確保できたセグメントアドレス

                ○ 参照:  hmem_alloc(), hmem_free(), hmem_getid(),
                          hmem_getsize(), hmem_lallocate(),
                          hmem_maxfree(), hmem_realloc(),
                          hmem_reallocbyte(), mem_assign()

------------------------------------------------------------------------
□ hmem_free - hmem_*で確保したメモリの開放

C:      void hmem_free( unsigned memseg );

        ------------------------------------------98N 98H AT DOS-
        hmem_free                                            5
        --------------------------------------------

                ● hmem_alloc, hmem_allocbyte, hmem_lallocate  の
                   いずれかで確保したメモリを開放します。

                ○ 参照:  hmem_alloc(), hmem_allocbyte(),
                          hmem_lallocate(), hmem_maxfree(),
                          hmem_realloc(), hmem_reallocbyte()

------------------------------------------------------------------------
□ hmem_getid - hmem_*で確保したブロックの用途を知る

C:      unsigned hmem_getid(unsigned mseg);                マクロ

        ------------------------------------------98N 98H AT DOS-
        hmem_getid
        -----------------------------------------------------<->-

                ● hmem_alloc, hmem_allocbyte, hmem_lallocate  の
                   いずれかで確保したメモリブロックのセグメント値
                   を指定して、そのブロックの用途を得ます。

                ← mseg  hmemメモリブロックのセグメント値

                → 用途  MEMID_UNKNOWN など(hmem_alloc() 参照)

                ★ hmemメモリブロックでない場所を指定すると、でた
                   らめな値が返ります。

                ○ 参照:  hmem_alloc(), hmem_allocbyte(),
                          hmem_getsize(), hmem_lallocate(),
                          hmem_realloc(), hmem_reallocbyte()

------------------------------------------------------------------------
□ hmem_getsize - hmem_*で確保したブロックの大きさを知る

C:      unsigned hmem_getsize(unsigned mseg);              マクロ

        ------------------------------------------98N 98H AT DOS-
        hmem_getsize
        -----------------------------------------------------<->-

                ● hmem_alloc, hmem_allocbyte, hmem_lallocate  の
                   いずれかで確保したメモリブロックのセグメント値
                   を指定して、そのブロックのパラグラフサイズを得
                   ます。

                ← mseg  hmemメモリブロックのセグメント値

                → パラグラフサイズ

                ★ hmemメモリブロックでない場所を指定すると、でた
                   らめな値が返ります。

                ○ 参照:  hmem_alloc(), hmem_allocbyte(),
                          hmem_getid(), hmem_lallocate(),
                          hmem_realloc(), hmem_reallocbyte()

------------------------------------------------------------------------
□ hmem_lallocate - ヒープからのメモリ確保(20bit バイト単位)

C:      unsigned hmem_lallocate( unsigned long bytesize );

        ------------------------------------------98N 98H AT DOS-
        hmem_lallocate                                       5
        -------------------------------------------

                ● バイト単位でサイズを指定して通常のメモリを確保
                   します。
                   このメモリブロックは、確保した順と異なった順で
                   開放することができますので、長時間使用するメモ
                   リなどの確保に向いています。
                   開放には必ず hmem_free()を使用してください。

                → 正数  得た先頭セグメント
                   0     管理メモリ領域が足りない

                ○ 参照:  hmem_alloc(), hmem_allocbyte(),
                          hmem_free(), hmem_getid(),
                          hmem_getsize(), hmem_maxfree(),
                          hmem_realloc(), hmem_reallocbyte(),
                          mem_assign()

------------------------------------------------------------------------
□ hmem_maxfree - hmem_*で確保可能な最大の大きさを知る

C:      unsigned hmem_maxfree(void);

        ------------------------------------------98N 98H AT DOS-
        hmem_maxfree
        -------------------------------------------

                ● hmem_alloc, hmem_allocbyte, hmem_lallocate  で
                   現在確保可能な最大の空間の大きさを、パラグラフ
                   単位で得ます。

                → パラグラフサイズ

                ○ バイト単位にするには 16倍すればいいよん。 この
                   ときに 16bitを越えることがままあるので、long整
                   数で計算するようにしてね。

                ○ 参照:  hmem_alloc(), hmem_allocbyte(),
                          hmem_free(), hmem_lallocate(),
                          hmem_realloc(), hmem_reallocbyte()

------------------------------------------------------------------------
□ hmem_realloc - hmem_*で確保したブロックの大きさ変更(16bitパラグラフ)

C:      unsigned hmem_realloc( unsigned oseg, unsigned parasize );

        ------------------------------------------98N 98H AT DOS-
        hmem_realloc
        -------------------------------------------

                ● hmem_alloc, hmem_allocbyte, hmem_lallocate  で
                   確保されたメモリブロックの大きさを変更します。

                ← oseg      hmemメモリブロック
                   parasize  新しい大きさ(パラグラフ単位)

                → 0      メモリ不足
                   0以外  成功。新しいメモリブロック

                ○ 新しい大きさが、現在の大きさと同じか小さくなる
                   場合は、メモリブロックのアドレスは変化せず、ま
                   た必ず成功します。
                ○ 大きくなる場合は、アドレスが移動する場合があり
                   ます。このとき、以前の内容はそのまま新しいアド
                   レスにコピーされます。後ろに増加した部分の内容
                   は不定です。

                ○ 参照:  hmem_alloc(), hmem_allocbyte(),
                          hmem_free(), hmem_getid(),
                          hmem_getsize(), hmem_lallocate(),
                          hmem_maxfree(), hmem_reallocbyte(),
                          mem_assign()

------------------------------------------------------------------------
□ hmem_reallocbyte - hmem_*で確保したブロックの大きさ変更(16bitバイト)

C:      unsigned hmem_reallocbyte( unsigned oseg, unsigned bytesize );

        ------------------------------------------98N 98H AT DOS-
        hmem_reallocbyte
        -------------------------------------------

                ● hmem_alloc, hmem_allocbyte, hmem_lallocate  で
                   確保されたメモリブロックの大きさを変更します。

                ← oseg      hmemメモリブロック
                   bytesize  新しい大きさ(バイト単位)

                → 0      メモリ不足
                   0以外  成功。新しいメモリブロック

                ○ 新しい大きさが、現在の大きさと同じか小さくなる
                   場合は、メモリブロックのアドレスは変化せず、ま
                   た必ず成功します。
                ○ 大きくなる場合は、アドレスが移動する場合があり
                   ます。このとき、以前の内容はそのまま新しいアド
                   レスにコピーされます。後ろに増加した部分の内容
                   は不定です。

                ○ 参照:  hmem_alloc(), hmem_allocbyte(),
                          hmem_free(), hmem_getid(),
                          hmem_getsize(), hmem_lallocate(),
                          hmem_maxfree(), hmem_realloc(),
                          mem_assign()

------------------------------------------------------------------------
□ mem_allocate - DOSメインメモリを上位から確保する

C:      unsigned mem_allocate( unsigned para );

        ------------------------------------------98N 98H AT DOS-
        mem_allocate                                         5
        -------------------------------------------

                ● DOSアロケーションストラテジを変更して、 最上位
                   からメモリを確保します。
                   アロケーションステラテジは実行前の値に復元しま
                   す。

                ← para  確保するパラグラフサイズ(1=16バイト)

                → 0      メモリ不足
                   0以外  確保したセグメントアドレス

                ○ 現在のDOSメモリから確保できる(空いている)最大
                   の大きさは、dos_maxfree()で得られます。

                ★ hmem_*やsmem_*を間接的にも全く使わないのでなけ
                   れば、あらかじめ mem_assign で DOSに空きメモリ
                   が存在するようにしておかなければ常に確保に失敗
                   します。

                ○ 参照:  mem_free(), mem_lallocate()

------------------------------------------------------------------------
□ mem_assign - 呼び出し側が割り当てたメモリを使用

C:      void mem_assign( unsigned top_seg, unsigned parasize );

        ------------------------------------------98N 98H AT DOS-
        mem_assign                                           5
        -------------------------------------------

                ● master.libの管理メモリ領域を割り当てます。
                   引数には先頭のセグメントアドレスと、そこから使
                   用可能なパラグラフサイズを指定してください。
                   DOSから確保する場合は次のような手順になります。
                      const unsigned  parasize = 4096; /* 64Kバイ
                                      ト */
                      unsigned  mem = mem_allocate( parasize );
                      mem_assign( mem, parasize );

                    パラグラフサイズは、 バイト数を16で割った値が
                    入ります。
                  割り当てる際には、 できるだけ広い領域を割り当て
                  るようにしてください。 特に、最低 64Kバイトは確
                  保しておくのが無難です。
                   なお、virtual_copy()関数のような、 大きなメモ
                  リ領域を必要とするものには、 以下のような表示し
                  ました。 利用する関数の合計必要量を上回るように
                  割り当ててください。
                      △MEMORY: 2000パラグラフのブロックを4個確保
                        します。

                    割り当てを解除するには、 mem_unassign()を使用
                    してください。

                ★ 各コンパイラの標準メモリ管理関数群と衝突しない
                   ような割り当てができます。以下のように行うこと
                   で安全にメモリをやりくりすることができるように
                   なります。

                  Microsoft Cの場合:
                      #include "malloc.h"
                         /* ポインタ正規化のずれを考慮して1つ大き
                         めに確保 */
                      void huge * mem = halloc( parasize + 1,  16
                      );
                      mem_assign( FP_REGULAR_SEG(mem), parasize );
                      ....
                      mem_unassign();
                      hfree( mem );

                  Borland C++ の場合
                      void far * mem = farmalloc( (parasize +  1)
                      * 16 );
                      mem_assign( FP_REGULAR_SEG(mem), parasize );
                      ....
                      mem_unassign();
                      farfree( mem );

                ○ 参照:  mem_assign_all(), mem_assign_dos(),
                          mem_unassign()

------------------------------------------------------------------------
□ mem_assign_all - DOSの最大空きメモリブロックを取得

C:      void mem_assign_all(void);

        ------------------------------------------98N 98H AT DOS-
        mem_assign_all                                       5
        -------------------------------------------

                ● 現在DOSから確保できる最大のメモリブロックを取
                   得し、それを管理領域として割り当てます。

                ○ 管理領域を DOS に開放するには、 mem_unassign()
                   を使用してください。

                ★ mem_assign* のいずれも実行せずにメモリを確保す
                   ると、自動的にこの関数が呼び出されます。

                ○ 参照:  mem_assign(), mem_assign_dos(),
                          mem_unassign()

------------------------------------------------------------------------
□ mem_assign_dos - 指定サイズのメモリブロックをDOSから取得

C:      int mem_assign_dos( unsigned parasize );

        ------------------------------------------98N 98H AT DOS-
        mem_assign_dos                                       5
        -------------------------------------------

                ● DOS から parasize パラグラフサイズのメモリブロ
                   ックを取得し、それを管理領域として割り当てます。

                → NoError             成功
                   InsufficientMemory  DOSメモリ領域が足りない

                ○ 管理領域を DOS に開放するには、 mem_unassign()
                   を使用してください。

                ○ 参照:  mem_assign(), mem_assign_all(),
                          mem_unassign()

------------------------------------------------------------------------
□ mem_free - DOSメモリブロックの開放

C:      void mem_free( unsigned seg );

        ------------------------------------------98N 98H AT DOS-
        mem_free                                             5
        --------------------------------------------

                ● DOSによって確保されているメモリブロックを開放
                   します。

                ← seg  DOSメモリブロックのセグメントアドレス

                ○ dos_free関数の別名です。

                ○ 参照:  dos_free(), mem_allocate(),
                          mem_lallocate()

------------------------------------------------------------------------
□ mem_lallocate - DOSメインメモリを上位から確保する(long版)

C:      unsigned mem_lallocate( unsigned long bytesize );

        ------------------------------------------98N 98H AT DOS-
        mem_lallocate                                        5
        -------------------------------------------

                ● DOSアロケーションストラテジを変更して、 最上位
                   からメモリを確保します。
                   アロケーションステラテジは実行前の値に復元しま
                   す。
                    バイト数で大きさを指定してください。

                ← bytesize  確保するバイト数

                → 0      メモリ不足
                   0以外  確保したセグメントアドレス

                ○ 現在のDOSメモリから確保できる(空いている)最大
                   の大きさは、dos_maxfree()で得られます。

                ★ hmem_*やsmem_*を間接的にも全く使わないのでなけ
                   れば、あらかじめ mem_assign で DOSに空きメモリ
                   が存在するようにしておかなければ常に確保に失敗
                   します。

                ○ 参照:  mem_allocate(), mem_free()

------------------------------------------------------------------------
□ mem_unassign - 管理メモリ領域を放棄

C:      int mem_unassign(void);

        ------------------------------------------98N 98H AT DOS-
        mem_unassign                                         5
        -------------------------------------------

                ● hmem_*, smem_*で確保されたブロックが一つも存在
                   しない(すべて開放されている)ときに、master.lib
                   の管理するメモリ領域を放棄します。

                → 0  失敗。 何か確保されたままのメモリブロックが
                      中に存在する。
                   1  成功。割り当ては放棄された。

                ○ これによって、mem_assign()で割り当てられたメモ
                   リを開放することができます。また、
                   mem_assign_dos(), mem_assign_all()のどちらかに
                   よってメモリが直接確保されていた場合は DOSにそ
                   のメモリを返します(開放します)。

                ★ 事前に、hmem_*, smem_*で確保されたものはすべて
                   開放してください。なお、パターンの開放は
                   super_free(), 仮想VRAMの開放は  virtual_free()
                   で行えます。
                ★ この関数の戻り値が「失敗」を表している場合は、
                   割り当ては放棄されていませんので注意してくださ
                   い。

                ○ 参照:  mem_assign(), mem_assign_all(),
                          mem_assign_dos()

------------------------------------------------------------------------
□ smem_lget - 高速メモリ確保(20bit)

C:      unsigned smem_lget( unsigned long bytesize );

        ------------------------------------------98N 98H AT DOS-
        smem_lget                                            5
        -------------------------------------------

                ● 20bit整数で大きさを指定する一時的なメモリ確保。
                   現在の確保ポインタをサイズ分うしろにずらして、
                   ずらす前の確保ポインタの値(セグメント)を返しま
                   す。
                   必ず開放は smem_release()を使用してください。

                → 正数                  得た先頭セグメント
                   ※InsufficientMemory  管理メモリ領域が足りない

                   ※ 戻り値の型が unsigned なのに対し、
                      InsufficientMemory は負の数なので、比較する
                      際にはつぎのようなキャストが必要です。

                    seg = smem_wget( size );
                    if ( seg == (unsigned)InsufficientMemory ) {
                             /* ~~~~~~~~~~ */
                        dos_puts( "メモリないってば"CRLF );
                    }

                ○ 参照:  mem_assign(), smem_maxfree(),
                          smem_release(), smem_wget()

------------------------------------------------------------------------
□ smem_maxfree - smem_*で確保できる最大量を計算する

C:      int smem_maxfree(void);                            マクロ

        ------------------------------------------98N 98H AT DOS-
        smem_maxfree                                         5
        -----------------------------------------------------<->-

                ● mem_TopHeap と mem_EndMark  の差を見ることによ
                   って smem_* で確保可能な最大値を得ます。

                → 最大確保可能量(パラグラフ単位)

                ○ 参照:  mem_assign(), smem_lget(),
                          smem_release(), smem_wget()

------------------------------------------------------------------------
□ smem_release - smem_*で確保したメモリの開放

C:      void smem_release( unsigned memseg );

        ------------------------------------------98N 98H AT DOS-
        smem_release                                         5
        --------------------------------------------

                ● 一時的に確保したメモリを開放します。
                   単に確保ポインタの値を memseg に設定するだけで
                   す。
                    この構造により、ほんの一瞬メモリを使いたいと
                   きに、高速に割り当てと開放ができるのですが、割
                   り当てたのと逆の順序で開放しないと、おかしな動
                   作をすることになります。(逆に、 最初に割り当て
                   たアドレスで開放するだけで、すべての開放ができ
                   ます)

                ○ 参照:  mem_assign(), smem_lget(),
                          smem_maxfree(), smem_wget()

------------------------------------------------------------------------
□ smem_wget - 高速メモリ確保(16bit)

C:      unsigned smem_wget( unsigned bytesize );

        ------------------------------------------98N 98H AT DOS-
        smem_wget                                            5
        -------------------------------------------

                ● 16bit整数で大きさを指定する一時的なメモリ確保。
                   現在の確保ポインタをサイズ分うしろにずらして、
                   ずらす前の確保ポインタの値(セグメント)を返しま
                   す。
                   必ず開放は smem_release()を使用してください。

                → 正数                  得た先頭セグメント
                   ※InsufficientMemory  管理メモリ領域が足りない

                   ※ 戻り値の型が unsigned なのに対し、
                      InsufficientMemory は負の数なので、比較する
                      際にはつぎのようなキャストが必要です。

                    seg = smem_wget( size );
                    if ( seg == (unsigned)InsufficientMemory ) {
                             /* ~~~~~~~~~~ */
                        dos_puts( "メモリないってば"CRLF );
                    }

                ○ 参照:  mem_assign(), smem_lget(),
                          smem_maxfree(), smem_release()


------------------------------------------------------------------------
■ LIM EMS 4.0 操作 ■■■■■■■■■■■■■■■■■■■■■■■■■■

        ・LIM EMS 4.0が必要です。
        ・ここの関数群を実行する場合、まず最初に
                ems_exist
         を実行して、存在する事を確認してから他の  ems_関数を呼
        んでください。

------------------------------------------------------------------------
□ 構造体/グローバル変数

        struct EMS_move_source_dest {
                long region_length;
                char source_memory_type;
                unsigned source_handle;
                unsigned source_initial_offset;
                unsigned source_initial_seg_page;
                char dest_memory_type;
                unsigned dest_handle;
                unsigned dest_initial_offset;
                unsigned dest_initial_seg_page;
        };

------------------------------------------------------------------------
□ ems_allocate - EMSメモリの確保

C:      unsigned ems_allocate( unsigned long len );

        ------------------------------------------98N 98H AT DOS-
        ems_allocate
        -------------------------------------------

                ● EMSメモリを確保します。 大きさはバイト単位で指
                   定してください。
                   成功すれば、EMSハンドルを返します。
                   失敗した場合、0を返します。

------------------------------------------------------------------------
□ ems_dos_read - ファイルからEMSへの読込み

C:      long ems_dos_read(  int   file_handle,   unsigned   short
                          ems_handle,   unsigned  long  ems_offs,
                          long read_bytes );

        ------------------------------------------98N 98H AT DOS-
        ems_dos_read                                         ○
        -------------------------------------------

                ● EMSの指定位置に、DOSのファイルハンドルからファ
                   イルの内容を読込みます。

                ← file_handle  オープンされたファイルハンドル
                   ems_handle   EMSのハンドル
                   ems_offs     EMSハンドル内のオフセットアドレス
                   read_bytes   転送するバイト数

                → -1L    エラー
                   0以上  転送したバイト数

                △MEMORY: 一時的に(smem) 16KBの転送バッファを確保
                  します。

------------------------------------------------------------------------
□ ems_dos_write - EMSからファイルへの書き込み

C:      long ems_dos_write( int file_handle,
                           unsigned short ems_handle, unsigned
                           long ems_offs, long write_bytes );

        ------------------------------------------98N 98H AT DOS-
        ems_dos_write                                        ○
        -------------------------------------------

                ● EMSの指定位置からの内容を  DOSのファイルに書き
                   込みます。

                ← file_handle  オープンされたファイルハンドル
                   ems_handle   EMSのハンドル
                   ems_offs     EMSハンドル内のオフセットアドレス
                   write_bytes  転送するバイト数

                → -1L    エラー
                   0以上  転送したバイト数

                △MEMORY: 一時的に(smem) 16KBの転送バッファを確保
                  します。

------------------------------------------------------------------------
□ ems_enablepageframe - NEC EMSページフレームバンクの操作

C:      void ems_enablepageframe( int enable );

        ------------------------------------------98N 98H AT DOS-
        ems_enablepageframe                        ○
        -------------------------------------------

                ● NECのEMSドライバにのみ意味のある処理です。
                   NECのドライバは、一部のEMSファンクションを実行
                   するとグラフィック画面の一部(B0000h~)の上にペ
                   ージフレームを開いてしまいますので、enable = 0
                   にしてこの処理を行ってください。
                ○ NEC の EMS ドライバ以外の場合、 実行しても何も
                   起こりません。

------------------------------------------------------------------------
□ ems_exist - EMSの存在検査

C:      int ems_exist(void);

        ------------------------------------------98N 98H AT DOS-
        ems_exist
        -------------------------------------------

                ● EMSドライバの存在を検査します。

                → 1 存在
                   0 不在

------------------------------------------------------------------------
□ ems_findname - 名前からEMSハンドルを探す

C:      unsigned ems_findname( const char * hname );

        ------------------------------------------98N 98H AT DOS-
        ems_findname
        -------------------------------------------

                ● 指定した名前と同じ名前をもつEMSハンドルを検索
                   します。

                → 0    エラー
                   1~  見つかったEMSハンドル

------------------------------------------------------------------------
□ ems_free - EMSメモリの開放

C:      int ems_free( unsigned handle );

        ------------------------------------------98N 98H AT DOS-
        ems_free
        --------------------------------------------

                ● ems_allocateで確保したメモリを開放します。
                   成功すれば 0 を返します。
                   失敗したら、EMS エラーコードを返します。

------------------------------------------------------------------------
□ ems_getsegment - EMS物理セグメント情報の取得

C:      int ems_getsegment( unsigned * segments, int maxframe );

        ------------------------------------------98N 98H AT DOS-
        ems_getsegment
        -------------------------------------------

                ● EMSの物理ページフレームのセグメントアドレスの
                   配列を得ます。
                   この結果、 segments[0]が物理ページフレーム番号
                   0 のセグメントアドレス、以下番号順にセグメント
                   アドレスが格納されます。このとき、セグメントは
                   昇順とは限りません。

                ← segments  セグメントの配列を格納する場所
                   maxframe  読み取れる最大数(= segmentsの大きさ)

                → 0      エラー
                   1~64  物理ページフレームの数

                ★ この関数は、 内部でEMSドライバの呼び出し結果を
                   加工していますので、 全く同じ機能はEMSドライバ
                   には存在しません。

------------------------------------------------------------------------
□ ems_maphandlepage - EMSハンドルページのマップ

C:      int ems_maphandlepage( int  phys_page,  unsigned  handle,
                              unsigned log_page );

        ------------------------------------------98N 98H AT DOS-
        ems_maphandlepage
        -------------------------------------------

                ● EMS の物理ページフレームに、 EMSハンドルの特定
                   ページを割り当てます。

                ← phys_page  物理ページ番号(0~)
                   handle     割り当てるEMSハンドル
                   log_page   EMSハンドルhandle内の論理ページ番号
                              (先頭=0, 以後16Kごとに1増加)

                → 0      成功
                   0以外  EMSエラーコード

------------------------------------------------------------------------
□ ems_movememoryregion - EMSメモリ領域の移動

C:      int ems_movememoryregion( const struct EMS_move_source_dest * block );

        ------------------------------------------98N 98H AT DOS-
        ems_movememoryregion
        --------------------------------------------

                ● EMSとメインメモリの間でデータを転送します。
                   詳しくは EMSの資料を読んでください。
                   なお、 このライブラリには、 ems_write,ems_read
                   という上位関数が用意されているので、通常はそち
                   らを利用してください。

                → 成功  0
                   失敗  EMS エラーコード

------------------------------------------------------------------------
□ ems_read - EMSメモリを読む

C:      int ems_read( unsigned handle, long offset,
                     void far * mem, long size );

        ------------------------------------------98N 98H AT DOS-
        ems_read
        --------------------------------------------

                ● EMSメモリからデータを読み込みます。
                   ems_movememoryregion と  ems_enablepageframeを
                   呼び出しています。

                ← handle  EMSハンドル
                   offset  そのハンドルが差すEMSメモリの先頭から
                           のオフセット
                   mem     格納先メモリ
                   size    転送するバイト数

                → 成功  0
                   失敗  EMS エラーコード

------------------------------------------------------------------------
□ ems_reallocate - EMSメモリの再確保

C:      int ems_reallocate( unsigned handle, unsigned long size );

        ------------------------------------------98N 98H AT DOS-
        ems_reallocate
        -------------------------------------------

                ● EMSのハンドルの大きさを変更します。

                ← handle 大きさを変更するEMSハンドル
                   size   新しい大きさ(バイト数)

                → 0      成功
                   0以外  EMSエラーコード

------------------------------------------------------------------------
□ ems_restorepagemap - EMSページマップの復元

C:      int ems_restorepagemap( unsigned handle );

        ------------------------------------------98N 98H AT DOS-
        ems_restorepagemap
        -------------------------------------------

                ● handleに待避した  EMSの最初の4つの物理ページフ
                   レームのマップ状態を復元します。

                → 0      成功
                   0以外  EMSエラーコード

------------------------------------------------------------------------
□ ems_savepagemap - EMSページマップの待避

C:      int ems_savepagemap( unsigned handle );

        ------------------------------------------98N 98H AT DOS-
        ems_savepagemap
        -------------------------------------------

                ● EMSの最初の4つの物理ページフレームのマップ状態
                   を、handleの待避領域に待避します。
                   ひとつのハンドルに対して2重待避はできません。

                → 0      成功
                   0以外  EMSエラーコード

------------------------------------------------------------------------
□ ems_setname - EMSハンドルに名前を設定する

C:      int ems_setname( unsigned handle, const char * name );

        ------------------------------------------98N 98H AT DOS-
        ems_setname
        -------------------------------------------

                ● すでに確保されたメモリに、名前を付けます。名前
                   は必ず 8文字にしてください。
                   そして、 余った場合は  '\0'(キャラクタコード0)
                   で埋めてください。
                   成功すれば、0を返します。
                   失敗したら EMS エラーコードを返します。
                   すでに同じ名前がある場合にはエラーとなります。

------------------------------------------------------------------------
□ ems_size - EMSハンドルの大きさを得る

C:      unsigned long ems_size( unsigned handle );

        ------------------------------------------98N 98H AT DOS-
        ems_size
        --------------------------------------------

                ● EMSハンドルの大きさをバイト数で得ます。

                → バイト数, 0ならエラー

------------------------------------------------------------------------
□ ems_space - EMSの空きバイト数を得る

C:      unsigned long ems_space(void);

        ------------------------------------------98N 98H AT DOS-
        ems_space
        -------------------------------------------

                ● EMSの空きメモリの合計量をバイト数で得ます。

                → バイト数, 0ならエラー

------------------------------------------------------------------------
□ ems_write - EMSメモリに書き込む

C:      int ems_write( unsigned handle, long offset,
                      const void far * mem, long size );

        ------------------------------------------98N 98H AT DOS-
        ems_write
        -------------------------------------------

                ● EMSメモリにメインメモリのデータを書き込みます。
                   ems_movememoryregion と  ems_enablepageframeを
                   呼び出しています。

                ← handle  EMSハンドル
                   offset  そのハンドルが差すEMSメモリの先頭から
                           のオフセット
                   mem     書き込むデータの先頭アドレス
                   size    転送するバイト数

                → 成功  0
                   失敗  EMS エラーコード


------------------------------------------------------------------------
■ XMS操作 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

         XMS規格のメモリ管理ドライバ (HIMEM.SYSや MEMORY-SERVER,
        QEMM386など)を利用して、EMB領域(1MB以上のメモリ領域、プロ
        トテクトメモリなどとも呼ばれます)に一時的な作業用メモリを
        確保し、読み書きします。
         これらの関数を使う場合、必ず xms_exist を実行してくださ
        い。これによって、実行の準備を行います。

------------------------------------------------------------------------
□ xms_allocate - EMBの確保

C:      unsigned xms_allocate( long memsize );

        ------------------------------------------98N 98H AT DOS-
        xms_allocate                                         ○
        -------------------------------------------

                ● EMBにメモリを確保します。
                   リアルモードでは、 アプリケーションが直接EMBに
                   アクセスすることはできませんので、
                   xms_movememoryなどを利用して転送することになり
                   ます。

                → 0      確保失敗
                   0以外  EMBハンドル

------------------------------------------------------------------------
□ xms_exist - XMSの存在確認と使用開始

C:      int xms_exist(void);

        ------------------------------------------98N 98H AT DOS-
        xms_exist                                            ○
        -------------------------------------------

                ● XMSドライバの存在を確認し、 存在する場合は制御
                   関数のアドレスを内部に記憶します。

                → 1  XMSドライバがある
                   0  XMSドライバがない

------------------------------------------------------------------------
□ xms_free - EMBの開放

C:      void xms_free( unsigned handle );

        ------------------------------------------98N 98H AT DOS-
        xms_free                                             ○
        --------------------------------------------

                ● xms_allocate()で確保した EMB上のメモリを開放し
                   ます。

------------------------------------------------------------------------
□ xms_maxfree - EMBの最大フリーブロックの大きさを得る

C:      unsigned long xms_maxfree(void);

        ------------------------------------------98N 98H AT DOS-
        xms_maxfree                                          ○
        -------------------------------------------

                ● XMSのEMB内の最大未使用ブロックの大きさを得ます。

                → バイト数 (0=エラー)

------------------------------------------------------------------------
□ xms_movememory - EMB-メインメモリ間の転送

C:      int xms_movememory( long destOff, unsigned destHandle,
                           long srcOff, unsigned srcHandle, long Length );

        ------------------------------------------98N 98H AT DOS-
        xms_movememory                                       ○
        --------------------------------------------

                ● 確保されたEMBメモリと、 メインメモリの間でブロ
                   ック転送を行います。

                ← destOff      destHandle = 0の場合、 メインメモ
                                リ内の書き込み先へのfarポインタ。
                                0以外の場合、 EMBのメモリブロック
                                内の書き込み先オフセットアドレス。
                   destHandle   0 = 転送先はメインメモリ
                                0以外 = 転送先はEMB
                   srcOff       srcHandle = 0の場合、メインメモリ
                                内の転送元へのfarポインタ。
                                0以外の場合、 EMBのメモリブロック
                                内の転送元オフセットアドレス。
                   srcHandle    0 = 転送元はメインメモリ
                                0以外 = 転送元はEMB
                   Length       転送するバイト数

                → 1  成功
                   0  失敗

------------------------------------------------------------------------
□ xms_reallocate - EMBの再確保

C:      unsigned xms_reallocate( unsigned handle, unsigned long newsize );

        ------------------------------------------98N 98H AT DOS-
        xms_reallocate                                       ○
        -------------------------------------------

                ● XMSのEMBに確保されたメモリブロックの大きさを変
                   更します。

                → 1  成功
                   0  失敗

------------------------------------------------------------------------
□ xms_size - EMBハンドルの大きさを得る

C:      unsigned long xms_size( unsigned handle );

        ------------------------------------------98N 98H AT DOS-
        xms_size                                             ○
        --------------------------------------------

                ● XMSのEMB領域に確保されたメモリブロックの大きさ
                   を得ます。

                ← handle  XMSのEMBハンドル

                → バイト数 (0=エラー)

------------------------------------------------------------------------
□ xms_space - EMBの残り総バイト数を得る

C:      unsigned long xms_space(void);

        ------------------------------------------98N 98H AT DOS-
        xms_space                                            ○
        -------------------------------------------

                ● XMSのEMB内の未使用領域の合計バイト数を得ます。

                → バイト数 (0=エラー)


------------------------------------------------------------------------
■ 常駐データ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

         常駐パレットなどのように、 メインメモリ内にデータを放置
        し、一時的にデータを他のアプリと共有するための処理をDOS汎
        用で用意しました。
         DOSの普通のメモリブロックとして管理するので、他のメモリ
        ブロックを誤ってアクセスしないように、 検索条件を厳しくし
        てあります。
        ・識別文字列、識別文字列の長さ
          メモリブロックの先頭から、 識別文字列の長さのバイト数だ
          け、完全に識別文字列と一致すること。
        ・パラグラフサイズ
          メモリブロックの大きさが指定したパラグラフサイズと完全
          に一致すること。
        たとえば、簡単な常駐データを作る場合、 構造体を作ると便利
        です。
        static char ID[] = "TestResData";
        #define IDLen (sizeof(ID)-1)
        #define Para  BYTE2PARA(sizeof(struct TestResData))
        struct TestResData {
          char id[TestResDataIDLen];
          int data;
        } ;

        ・データの作成、書き換え
        struct TestResData far * rd;
        unsigned seg = resdata_create(ID, Len, Para);
        if ( seg ) {
            rd = (struct TestResData far *)FP2SEG(seg);
            rd->data = 5 ;      /* 格納したいデータ */
        } else { 失敗 }

        ・データの読み込み
        struct TestResData far * rd;
        unsigned seg = resdata_exist(ID, Len, Para);
        if ( seg ) {
            rd = (struct TestResData far *)FP2SEG(seg);
            return rd->data ; /* などなど */
        } else { 失敗 }

        ・データの開放
        unsigned seg = resdata_exist(ID, Len, Para);
        if ( seg ) {
            resdata_free(seg);
        }

------------------------------------------------------------------------
□ resdata_create - 常駐データの作成

C:      unsigned resdata_create( const char * id, unsigned idlen,
                                unsigned parasize );

        ------------------------------------------98N 98H AT DOS-
        resdata_create                                       ○
        --------------------------------------------

                ● 常駐データを作成します。内容は、識別文字列だけ
                   書き込み、残りは不定です。すでに存在した場合、
                   見つかったアドレスを返します。

                ← id        識別文字列
                   idlen     識別文字列の長さ
                   parasize  メモリブロックのパラグラフサイズ

                → 0      指定のパラグラフサイズのメモリブロック
                          が作成できない
                   0以外  作成した、 あるいは見つかった先頭セグメ
                          ントアドレス。

------------------------------------------------------------------------
□ resdata_exist - 常駐データの検索

C:      unsigned resdata_exist( const char * id, unsigned  idlen,
                               unsigned parasize );

        ------------------------------------------98N 98H AT DOS-
        resdata_exist                                        ○
        --------------------------------------------

                ● 常駐データを検索し、そのセグメント位置を返しま
                   す。

                ← id        識別文字列
                   idlen     識別文字列の長さ
                   parasize  メモリブロックのパラグラフサイズ

                → 0      見つからなかった
                   0以外  見つかった。先頭アドレス。

------------------------------------------------------------------------
□ resdata_free - 常駐データの開放

C:      void resdata_free( unsigned seg );                 マクロ

        ------------------------------------------98N 98H AT DOS-
        resdata_free                                         ○
        -----------------------------------------------------<->-

                ● 常駐データを開放します。

                ← seg  セグメントアドレス

                ○ dos_freeを呼び出しているだけです。


------------------------------------------------------------------------
■ 文字、文字列処理 ■■■■■■■■■■■■■■■■■■■■■■■■■■

         文字コードや、文字列に関する処理です。ここにある関数は、
        一般的に 8086系CPUであれば動作します。

------------------------------------------------------------------------
□ jis_to_sjis - JISコードをシフトJISに変換

C:      unsigned jis_to_sjis( unsigned jis );

        ------------------------------------------98N 98H AT DOS-
        jis_to_sjis                                          ○
        -------------------------------------------

                ● JIS全角文字コードをシフトJIS全角に変換します。

                ★ JIS全角文字コードでない値で呼ばれた場合、 結果
                   は不定です。

                ○ 参照:  sjis_to_jis

------------------------------------------------------------------------
□ sjis_to_jis - シフトJISコードをJISに変換

C:      unsigned sjis_to_jis( unsigned sjis );

        ------------------------------------------98N 98H AT DOS-
        sjis_to_jis                                          ○
        -------------------------------------------

                ● シフトJIS全角文字コードをJIS全角に変換します。

                ★ シフトJIS全角文字コードでない値で呼ばれた場合、
                   結果は不定です。

                ○ 参照:  jis_to_sjis

------------------------------------------------------------------------
□ str_comma - 整数のカンマ付き文字列化

C:      int str_comma( char * buf, long val, unsigned buflen );

        ------------------------------------------98N 98H AT DOS-
        str_comma
        -------------------------------------------

                ● 符号付きの整数を、3桁毎にカンマをつけて右詰め
                   で指定文字数の文字列にします。負数ならば最上位
                   の桁の左に'-'が付きます。

                ← buf     文字列の格納先
                   val     文字列にしたい数値
                   buflen  格納文字数+1 (末尾の'\0'を含めたバイト
                           数)

                → 1    成功
                   0    失敗(格納先の桁数が足りない)

------------------------------------------------------------------------
□ str_ctopas - C文字列をパスカル文字列に書き換える

C:      char * str_ctopas( char * PascalString, const char * CString );

        ------------------------------------------98N 98H AT DOS-
        str_ctopas
        --------------------------------------------

                ● C言語形式の文字列へのポインタを渡すと、 その文
                   字列をパスカル形式に変換します。
                   返値は PascalString になります。
                   CString と PascalString を一致させることもでき
                   ます。

                ○ 参照:  str_pastoc

------------------------------------------------------------------------
□ str_iskanji2 - 文字列の指定位置の漢字2バイト目判定

C:      int str_iskanji2( const char * str, int n );

        ------------------------------------------98N 98H AT DOS-
        str_iskanji2
        -------------------------------------------

                ● 文字列の中の nバイト目が、 漢字の2バイト目かど
                   うかを調べます。

                ← str  文字列の先頭
                   n    判定する位置(0=先頭)

                → 1  漢字2バイト目
                   0  以外

                ○ Microsoft C, Borland C++などの  nthctypeに似て
                   いますが、漢字2バイト目かどうかだけ判定します。
                ○ コンパイラ依存を減らすために作成されています。

------------------------------------------------------------------------
□ str_pastoc - パスカル文字列をC文字列に書き換える

C:      char * str_pastoc( char * CString, const char * PascalString );

        ------------------------------------------98N 98H AT DOS-
        str_pastoc
        --------------------------------------------

                ● パスカル文字列へのポインタを渡すと、その文字列
                   をC言語形式の文字列に変換します。
                   返値は CString になります。
                   CString と PascalString を一致させることもでき
                   ます。

                ○ 参照:  str_ctopas

------------------------------------------------------------------------
□ str_printf - sprintfの簡易版

C:      void str_printf( char * buf, const char * format, ... );

        ------------------------------------------98N 98H AT DOS-
        str_printf
        -------------------------------------------

                ● C言語stdio.hの sprintfの簡略・縮小版です。
                   書式(format)には、次のものだけが使えます。
                        %<文字数>s  文字列
                        %<桁>u      符号なし整数
                        %<桁>X      符号なし16進数
                        %<桁>b      符号なし2進数
                        %c          文字
                        %%          %自身
                     %で始めて、上記以外の文字で終った場合は  %u
                    の扱いになります。
                     <文字数>は、 左詰めの最小文字数を表します。
                    余った分は空白で埋めます。
                     %sは masters.lib,masterm.lib は near ポイン
                    タのみ、masterc.lib,masterl.lib   はfarポイン
                    タのみになります。
                     <桁>は右詰めで、省略するとなにも書きません。
                    0で始めると左に余った桁は0で埋め、0以外で始め
                    ると空白で埋めます。また、数字の最後に 'l'(小
                    文字のL)をつけると long型の値をとります。
                     %x(小文字のx)を指定すると、%X(大文字)の処理
                    をします。


------------------------------------------------------------------------
■ ディスク・ファイル関連 ■■■■■■■■■■■■■■■■■■■■■■■


------------------------------------------------------------------------
■ MS-DOS 単純ファイル操作 ■■■■■■■■■■■■■■■■■■■■■■

         同時オープン数を 1 に制限した、バッファリングを行うファ
        イルアクセスルーチン集です。
         フィルタなどのように、 同時に複数オープンする必要がある
        用途には使えませんが、 単独データファイルの読み書きなどの
        用途のために作成しました。

         デフォルトでは、 バッファリングは機能しないようになって
        いますので、 DOS を直接よぶのと変わらず、小さな単位でアク
        セスすると低速です。しかし、file_assign_buffer() を利用し
        てバッファを指定すると、 そこを作業バッファにしてディスク
        アクセスの回数を減らし、 高速なファイル処理を狙うことがで
        きます。
         このメリットを生かすためには、 文字単位でのアクセスをで
        きるだけ避け、 file_skip_until() などのような特殊機能関数
        を呼び出すようにしてください。
         また、バッファリングを行うと、CON,AUX  などのリアルタイ
        ム性が要求されるデバイスでの出力に問題がでますので、 注意
        してください。

         さらに、アクセスは「バイナリモード」 に相当するモードし
        かありません。 つまり、改行コードを変換しないので、改行を
        読み込むと、'\r' '\n'と連続して2バイト現れ、書き込む時も
        この順でかかなくてはいけません。

         と、このような制限がありますが、単純で小さいので、 実行
        形式のサイズを気にする場合に使ってみてください。
         また、バッファが大きくでき、常にFARメモリを使うので、ス
        モールモデルでFARメモリを扱う場合や、大きなファイルを一気
        に読み書きする場合に高速に処理できます。

------------------------------------------------------------------------
□ 構造体/グローバル変数

void far * file_Buffer;         アクセスバッファ
unsigned file_BufferSize;       アクセスバッファの大きさ
unsigned long file_BufferPos;   バッファ先頭のファイル内位置
int file_sharingmode ;          読み込みオープン時の共有モード

        以下の変数は直接参照・変更しないで下さい。

unsigned file_BufPtr;
unsigned file_InReadBuf;
int file_Eof;
int file_ErrorStat;
int file_Handle;

------------------------------------------------------------------------
□ file_append - ファイルの追加・読み書きオープン

C:      int file_append( const char * filename );

        ------------------------------------------98N 98H AT DOS-
        file_append                                          5
        -------------------------------------------

                ● 既存ファイルをオープンし、最終バイトの次にseek
                   します。ファイルが存在しない場合は失敗します。
                   読み書きをともに行う場合、読み書きの間の切り替
                   えにはfile_seekを実行する必要があります。(バッ
                   ファリングを行っていない場合はこれは実行しなく
                   ても問題ありません)

                → 1  成功
                   0  失敗

------------------------------------------------------------------------
□ file_assign_buffer - 作業バッファの割り当て

C:      void file_assign_buffer(void far * buf,unsigned siz);  マ
        クロ

        ------------------------------------------98N 98H AT DOS-
        file_assign_buffer                                   ○
        -----------------------------------------------------<->-

                ● ファイルアクセスの作業バッファを割り当てます。
                   file_*を使用する前に実行する必要があります。
                    使用者が何らかの手段で確保したバッファ用メモ
                   リの先頭アドレスを bufに、バイト数をsiz に指定
                   して下さい。
                    siz は大きいほど実際のファイルへのアクセスの
                   回数が少なくなります。

                ★ 作業バッファは、file_*系関数が内部ワークとして
                   利用するための領域です。この領域を直接読み書き
                   した場合、結果は予測できません。

                ★ バッファの割り当ての解除について:
                         割り当てたバッファを解除するには、sizを
                        0にして呼び出して下さい。ただし、これはフ
                        ァイルがオープンされたままの状態で実行す
                        ると誤動作するので注意して下さい。

------------------------------------------------------------------------
□ file_basename - ファイル名部分を見つける

C:      char * file_basename( char * pathname );

        ------------------------------------------98N 98H AT DOS-
        file_basename                                        5
        -------------------------------------------

                ● パス名の中から、最後の要素を見つけ出します。
                    file_basename( "A:\abc\表" ) は、 渡された文
                   字列の中の"表"のアドレスを返します。
                    :,\,/のどれも無い場合は文字列をそのまま返し、
                   これらの文字で終っている場合は、末尾のヌル文字
                   を差します。
                    ファイルアクセスとは独立しているので、すでに
                   file_ropenなどが行われていても動作します。

------------------------------------------------------------------------
□ file_close - ファイルを閉じる

C:      void file_close(void);

        ------------------------------------------98N 98H AT DOS-
        file_close                                           5
        -------------------------------------------

                ● 開かれたファイルを閉じます。
                   すでに書き込みまたは読み込みオープンされている
                   必要があります。
                   書き込みエラーの判定は、file_error()で行ってく
                   ださい。

------------------------------------------------------------------------
□ file_create - ファイルの作成・書き込みオープン

C:      int file_create( const char * filename );

        ------------------------------------------98N 98H AT DOS-
        file_create                                          5
        -------------------------------------------

                ● ファイルを新規に作成し、オープンします。

                → 1  成功
                   0  失敗

------------------------------------------------------------------------
□ file_delete - ファイルの削除

C:      int file_delete( const char * filename );

        ------------------------------------------98N 98H AT DOS-
        file_delete                                          5
        -------------------------------------------

                ● ファイルを削除します。
                   ファイルアクセスとは独立しているので、  すでに
                   file_ropenなどが行われていても動作します。

                → 1  成功
                   0  失敗

------------------------------------------------------------------------
□ file_eof - ファイル末尾を読み込んだかどうか

C:      int file_eof(void);                                マクロ

        ------------------------------------------98N 98H AT DOS-
        file_eof                                             5
        -----------------------------------------------------<->-

                ● すでに読み込みが末尾に達しているかどうかを判定
                   します。

                → 1  読み込みが末尾(EOF)に達している
                   0  まだ読める

------------------------------------------------------------------------
□ file_error - 書き込みエラーの有無

C:      int file_error(void);                              マクロ

        ------------------------------------------98N 98H AT DOS-
        file_error                                           5
        -----------------------------------------------------<->-

                ● 書き込みによってエラーが発生した後ならば、
                   1(true)を返します。
                   オープンしたあとまだ発生していないなら、 0を返
                   します。
                    書き込みオープンされたときにのみクリアされま
                   す。つまりクローズしても読むことができます。

------------------------------------------------------------------------
□ file_exist - ファイルの存在検査

C:      int file_exist( const char * filename );

        ------------------------------------------98N 98H AT DOS-
        file_exist                                           5
        -------------------------------------------

                ● ファイルの存在を検査します。
                   ファイルアクセスとは独立しているので、  すでに
                   file_ropenなどが行われていても動作します。

                → 1  存在
                   0  不在,エラー

------------------------------------------------------------------------
□ file_flush - 作業バッファのフラッシュ

C:      void file_flush(void);

        ------------------------------------------98N 98H AT DOS-
        file_flush                                           5
        -------------------------------------------

                ● 開かれたファイルの作業バッファをフラッシュしま
                   す。
                    すなわち、読み込みオープンされていた場合は作
                   業バッファを空にし、書き込みオープンされていた
                   場合は、作業バッファの内容を実際に書き込み、や
                   はり空にします。

                    書き込みエラーの判定は、file_error()で行って
                   ください。

------------------------------------------------------------------------
□ file_getc - ファイルからの1バイト読み込み

C:      int file_getc(void);

        ------------------------------------------98N 98H AT DOS-
        file_getc                                            5
        --------------------------------------------

                ● ファイルから、1 バイト読み込みます。
                   すでに読み込みオープンされている必要があります。

                → 0~255  読み込んだ値
                   -1      すでにEOFに達している

------------------------------------------------------------------------
□ file_gets - 指定文字またはサイズまで読み込む

C:      unsigned file_gets( void far * buf, unsigned bsize, int endchar );

        ------------------------------------------98N 98H AT DOS-
        file_gets                                            5
        --------------------------------------------

                ● ファイルから、指定データが見つかるか、指定バイ
                   ト数(bsize - 1)に達するまで bufに読み込みます。
                   buf = 0 ならば、読み込まずに捨てます。

                   すでに読み込みオープンされている必要があります。

                → 読み込んだ文字数

                ★ file_assign_buffer()の実行が前もって必要です。
                   (そうでなければ異常動作します)

------------------------------------------------------------------------
□ file_getw - ファイルからの1ワード読み込み

C:      int file_getw(void);

        ------------------------------------------98N 98H AT DOS-
        file_getw                                            5
        -----------------------------------------------

                ● ファイルから、下位、上位の順に2バイト読み込み、
                   16bit整数に組み上げます。
                   EOF時には値がくずれますので、  EOF確認には必ず
                   file_eofを用いてください。
                   すでに読み込みオープンされている必要があります。

                → 読み込んだ2バイトの値

------------------------------------------------------------------------
□ file_lread - ファイルの読み込み(long版)

C:      unsigned long file_lread( void far * buf, unsigned long wsize );

        ------------------------------------------98N 98H AT DOS-
        file_lread                                           5
        -------------------------------------------

                ● ファイルから、bufにwsizeバイト読み込みます。
                   すでに読み込みオープンされている必要があります。
                   64Kバイトを超えていても動作します。

                → 読み込んだバイト数(0~wsize)

------------------------------------------------------------------------
□ file_lsettime - ファイルの最終更新時刻を変更する(long版)

C:      int file_lsettime( unsigned long filetime );

        ------------------------------------------98N 98H AT DOS-
        file_lsettime                                        5
        -------------------------------------------

                ● 現在読み込みオープンされているファイルの最終更
                   新時刻を変更します。

                ← filetime  file_time()の戻り値と同じ形式の、 上
                             位16bit=日付、下位16bit=時刻の値

                → 1  成功(実際にはクローズ時に変更されます)
                   0  ファイルが開かれていない

------------------------------------------------------------------------
□ file_lwrite - ファイルの書き込み(long版)

C:      int file_lwrite( const void far * buf, unsigned long wsize );

        ------------------------------------------98N 98H AT DOS-
        file_lwrite                                          5
        -------------------------------------------

                ● ファイルにbufからwsizeバイトの内容を書き込みま
                   す。
                   すでに書き込みオープンされている必要があります。
                   wsizeは64Kバイトを超えていても動作します。

                → 1  成功
                   0  失敗

------------------------------------------------------------------------
□ file_putc - ファイルへの1バイト書き込み

C:      void file_putc( int chr );

        ------------------------------------------98N 98H AT DOS-
        file_putc                                            5
        --------------------------------------------

                ● ファイルに1バイト書き込みます。
                   すでに書き込みオープンされている必要があります。
                   (要file_assign_buffer())

------------------------------------------------------------------------
□ file_putw - ファイルへの1ワード書き込み

C:      void file_putw( int i );

        ------------------------------------------98N 98H AT DOS-
        file_putw                                            5
        -----------------------------------------------

                ● ファイルに下位バイト、上位バイトの順に書き込み
                   ます。
                   すでに書き込みオープンされている必要があります。

------------------------------------------------------------------------
□ file_read - ファイルの読み込み

C:      int file_read( void far * buf, unsigned wsize );

        ------------------------------------------98N 98H AT DOS-
        file_read                                            5
        --------------------------------------------

                ● ファイルから、bufにwsizeバイト読み込みます。
                   すでに読み込みオープンされている必要があります。

                → 読み込んだバイト数(0~wsize)

------------------------------------------------------------------------
□ file_ropen - ファイルの読み込みオープン

C:      int file_ropen( const char * filename );

        ------------------------------------------98N 98H AT DOS-
        file_ropen                                           5
        -------------------------------------------

                ● ファイルを読み込みの為にオープンします。

                → 0以外  成功
                   0      失敗

                ★ CON などのキャラクタデバイスを開いても正常に読
                   み込むことはできません。

------------------------------------------------------------------------
□ file_seek - ファイルポインタの移動

C:      void file_seek( long pos, int dir );

        ------------------------------------------98N 98H AT DOS-
        file_seek                                            5
        --------------------------------------------

                ● 作業バッファをフラッシュ(file_flush)し、ファイ
                   ルポインタを変更します。

                ← pos 基準点からの移動量
                   dir 0: 基準点=ファイル先頭
                       1: 基準点=現在のファイルポインタ
                       2: 基準点=ファイル末尾

                    書き込みオープンされていた場合、フラッシュが
                   失敗している可能性もあります。この場合は
                   file_error()で判定してください。

------------------------------------------------------------------------
□ file_settime - ファイルの最終更新時刻を変更する

C:      int file_settime(unsigned date,unsigned time);

        ------------------------------------------98N 98H AT DOS-
        file_settime                                         5
        -------------------------------------------

                ● 現在読み込みオープンされているファイルの最終更
                   新時刻を変更します。

                ← date 日付(MS-DOSファイル時刻形式)
                   time 時刻(〃)

                → 1  成功(実際にはクローズ時に変更されます)
                   0  ファイルが開かれていない

------------------------------------------------------------------------
□ file_size - ファイルの大きさを得る

C:      long file_size(void);

        ------------------------------------------98N 98H AT DOS-
        file_size                                            5
        --------------------------------------------

                ● 現在読み込みオープンされているファイルの大きさ
                   を得ます。

                → -1    ファイルが開かれていない
                   以外  ファイルの大きさ

------------------------------------------------------------------------
□ file_skip_until - 指定文字まで読み捨てる

C:      void file_skip_until( int data );

        ------------------------------------------98N 98H AT DOS-
        file_skip_until                                      5
        -------------------------------------------

                ● ファイルの中を、指定データと同じバイトまで読み
                   捨てます。(見つかったバイトは読み捨てられます)
                   すでに読み込みオープンされている必要があります。

------------------------------------------------------------------------
□ file_splitpath, file_splitpath_slash - パス名を構成要素に分解

C:      void file_splitpath(  const  char   *path,   char   *drv,
                            char *dir, char *name, char *ext ) ;
C:      void file_splitpath_slash(   char   *path,   char   *drv,
                                  char *dir, char   *name,   char
                                  *ext ) ;

        ------------------------------------------98N 98H AT DOS-
        file_splitpath
        -------------------------------------------
        file_splitpath_slash
        -------------------------------------------

                ● パス名を分解し、ドライブ名、ディレクトリパス、
                   ファイル名、 拡張子の4つの要素を切り出します。
                   ただの文字列処理ですので、実際にディレクトリ検
                   査などはせず、name,extはその文字列の最後の要素
                   がつかわれます。

                ← path   切り分け元のパス名
                   drv    "A:"の書き込み先(3バイト)
                   dir    "\dir\"の書き込み先(pathの長さ)
                   name   "filename"の書き込み先(9バイト)
                   ext    ".ext"の書き込み先(6バイト)

                ○ drv,dir,name,extは、NULLを指定するとそれぞれ省
                   略できます。
                ○ file_splitpath は、最後の要素が"."で始まってい
                   る場合、nameに格納します。
                ○ file_splitpath_slash は、pathの内容の  '\'  を
                   '/'に置換してから同じ作業を行います。 また、最
                   後の要素が"."で始まっている場合、extに格納しま
                   す。

------------------------------------------------------------------------
□ file_tell - ファイルポインタの読み取り

C:      unsigned long file_tell(void);

        ------------------------------------------98N 98H AT DOS-
        file_tell                                            5
        --------------------------------------------

                ● ファイルポインタの現在位置を読み取ります。
                   0 はファイル先頭です。

------------------------------------------------------------------------
□ file_time - ファイルの最終更新時刻を得る

C:      unsigned long file_time(void);

        ------------------------------------------98N 98H AT DOS-
        file_time                                            5
        --------------------------------------------

                ● 現在読み込みオープンされているファイルの最終更
                   新時刻を得ます。

                → 0      ファイルが開かれていない
                   0以外  上位16bit:日付, 下位16bit:時刻(MS-DOSフ
                          ァイル時刻形式)

------------------------------------------------------------------------
□ file_write - ファイルの書き込み

C:      int file_write( const void far * buf, unsigned wsize );

        ------------------------------------------98N 98H AT DOS-
        file_write                                           5
        -------------------------------------------

                ● ファイルにbufからwsizeバイトの内容を書き込みま
                   す。
                   すでに書き込みオープンされている必要があります。

                → 1  成功
                   0  失敗


------------------------------------------------------------------------
■ pf.lib バッファされたファイルアクセス ■■■■■■■■■■■■■■■

         file_openなどと異なり、複数のファイルを同時にオープンで
        きる、バッファされたファイルアクセス関数群です。

         関数はリード系とライト系に分かれています。 リード系とラ
        イト系の関数は別系統のものなので、 必ず、bopenr()したファ
        イルはリード系の、 bopenw()したファイルはライト系の関数を
        使ってください。チェックはしていません。

    リード系 : bopenr(), bcloser(), bgetc(), bread(), bseek(),
               bseek_()

    ライト系 : bopenw(), bclosew(), bputc(), bputw(), bputs(),
               bwrite(), bflush()

         アクセスは file_系と同様に、「バイナリモード」 に相当す
        るモードしかありません。 つまり、改行コードを変換しないの
        で、改行を読み込むと、'\r' '\n'と連続して2バイト現れ、書
        き込む時もこの順でかかなくてはいけません。

------------------------------------------------------------------------
□ 構造体/グローバル変数

unsigned bbufsiz;       bopenr(), bopenw()でバッファを
                        hmem_allocbyte()するときのサイズ。 初期値
                        はBBUFSIZ(==512)。 bsetbufsiz()で変更でき
                        る。

------------------------------------------------------------------------
□ bcloser - ファイルの読み込みクローズ

C:      void bcloser(bf_t hbf);

        ------------------------------------------98N 98H AT DOS-
        bcloser                                              ○
        --------------------------------------------

                ● bopenr()でオープンしたファイルをクローズします。
                   bopenr()で確保した領域を開放するので、必ず呼ん
                   でください。

------------------------------------------------------------------------
□ bclosew - ファイルの書き込みクローズ

C:      void bclosew(bf_t hbf);

        ------------------------------------------98N 98H AT DOS-
        bclosew                                              ○
        --------------------------------------------

                ● bopenw()でオープンしたファイルをクローズします。
                   バッファに残っているデータをファイルに書き出し、
                   bopenw()で確保した領域を開放しているので、必ず
                   呼んでください。

------------------------------------------------------------------------
□ bdopen - ファイルハンドルからの再オープン

C:      bf_t bdopen(int dos_handle);

        ------------------------------------------98N 98H AT DOS-
        bdopen                                               ○
        ---------------------------------------------

                ● DOSファイルハンドルに、バッファを割り当て、
                   bf_tハンドルを作成します。

                ← dos_handle  MS-DOSのファイルハンドル。
                               dos_ropenなどの値が使えます。
                → 0      エラー。pferrno  にエラー種別が設定され
                          る。

                ○ これ自体はリード形、ライト系のどちらも兼ねます
                   が、dos_handle  のオープン時に指定されたモード
                   に合わせて使ってください。なお、読み書き両用に
                   は対応していません。

------------------------------------------------------------------------
□ bflush - 書き込みファイルバッファのフラッシュ

C:      int bflush(bf_t hbf);

        ------------------------------------------98N 98H AT DOS-
        bflush                                               ○
        ---------------------------------------------

                ● バッファにたまっているデータを書き出します。

------------------------------------------------------------------------
□ bgetc - ファイルからの1バイト読み込み

C:      int bgetc(bf_t hbf);

        ------------------------------------------98N 98H AT DOS-
        bgetc                                                ○
        ----------------------------------------------

                ● ファイルから 1文字読み込んで返します。ファイル
                   の終わりに達しているときは -1 を返します。

------------------------------------------------------------------------
□ bopenr - ファイルの読み込みオープン

C:      bf_t bopenr(const char *file);

        ------------------------------------------98N 98H AT DOS-
        bopenr                                               ○
        ---------------------------------------------

                ● ファイル fileを読込み用にオープンします。
                   hmem_allocbyte()によって確保した管理構造体への
                   セグメントアドレスを返します。何らかの理由でオ
                   ープンできなかったときは 0を返します。

                → 0      エラー。pferrno  にエラー種別が設定され
                          る。

                △MEMORY: (8+bbufsiz)バイトのメモリブロックを確保
                  します。

------------------------------------------------------------------------
□ bopenw - ファイルの書き込みオープン

C:      bf_t bopenw(const char *fname);

        ------------------------------------------98N 98H AT DOS-
        bopenw                                               ○
        ---------------------------------------------

                ● ファイル fileを書込み用にオープンします。
                   hmem_allocbyte()によって確保した管理構造体への
                   セグメントアドレスを返します。何らかの理由でオ
                   ープンできなかったときは 0を返します。

                → 0      エラー。pferrno  にエラー種別が設定され
                          る。

------------------------------------------------------------------------
□ bputc - ファイルへの1バイト書き込み

C:      int bputc(int c, bf_t hbf);

        ------------------------------------------98N 98H AT DOS-
        bputc                                                ○
        ----------------------------------------------

                ● 文字 c を出力します。通常は文字 c を返しますが、
                   エラーがあった場合には -1 を返します。

------------------------------------------------------------------------
□ bputs - ファイルへの文字列書き込み

C:      int bputs(const char *s, bf_t hbf);

        ------------------------------------------98N 98H AT DOS-
        bputs                                                ○
        ----------------------------------------------

                ● 文字列 s を出力します。 成功すると文字列の長さ
                   を、エラーがあると -1 を返します。

------------------------------------------------------------------------
□ bputw - ファイルへの2バイト整数書き込み

C:      int bputw(int w, bf_t hbf);

        ------------------------------------------98N 98H AT DOS-
        bputw                                                ○
        ----------------------------------------------

                ● 整数 c を出力します。通常は整数 w を返します。
                   エラーがあった場合には -1 を返すが、w に  -1を
                   指定した場合はエラーでなくても  -1が返るので注
                   意(区別する手段はありません)。

------------------------------------------------------------------------
□ bread - ファイルからの読み込み

C:      int bread(void *buf, int size, bf_t hbf);

        ------------------------------------------98N 98H AT DOS-
        bread                                                ○
        ----------------------------------------------

                ● ファイルから bufで指定された領域に  sizeバイト
                   読み込みます。実際に読み込んだバイト数を返しま
                   す。

------------------------------------------------------------------------
□ bseek - ファイルからの読み込み位置を進める

C:      int bseek(bf_t hbf, long offset);

        ------------------------------------------98N 98H AT DOS-
        bseek                                                ○
        ----------------------------------------------

                ● ファイルの読込み位置を  offsetバイト進めます。
                   通常は 0、エラーがあった場合は -1 を返します。

------------------------------------------------------------------------
□ bseek_ - ファイルからの読み込み位置の移動

C:      int bseek_(bf_t bf,long offset,int whence);

        ------------------------------------------98N 98H AT DOS-
        bseek_                                               ○
        ---------------------------------------------

                ● ファイルの読込み位置を移動します。

                ← offset 基準点からの移動量
                   whence 0:  基準点=ファイル先頭
                          1:  基準点=現在のファイルポインタ
                          2:  基準点=ファイル末尾

                → 通常は 0、エラーがあった場合は -1 を返します。

------------------------------------------------------------------------
□ bsetbufsiz - 次回オープン時のファイルバッファの大きさの指定

C:      unsigned bsetbufsiz(unsigned bufsiz);              マクロ

        ------------------------------------------98N 98H AT DOS-
        bsetbufsiz                                           ○
        -----------------------------------------------------<->-

                ● bopenr(), bopenw()内では、ファイルアクセス用の
                   バッファを  hmem_allocbyte()で確保しています。
                   このバッファのサイズは何も指定しなければ
                   BBUFSIZ(==512バイト)ですが、この関数で事前に変
                   更できます。(参照→グローバル変数 bbufsiz)

------------------------------------------------------------------------
□ bwrite - ファイルへの書き込み

C:      int bwrite(const void *buf, int size, bf_t hbf);

        ------------------------------------------98N 98H AT DOS-
        bwrite                                               ○
        ---------------------------------------------

                ● bufが指す sizeバイトのデータを出力します。実際
                   に出力したバイト数を返します。


------------------------------------------------------------------------
■ pf.lib parファイルアクセス ■■■■■■■■■■■■■■■■■■■■■

         par.exeで作成した  par形式のパックファイル(parファイル)
        を、その構造を意識せずに読みだすための関数群です。
         parファイルをアクセスする各関数は、 C標準ライブラリ関数
        に似せてあり、すべての関数名は"pf"で始まります。C標準ライ
        ブラリ関数が FILE構造体へのポインタを受渡しするのと同様に、
        本ライブラリ関数は pf_t ハンドルを用います。

        ●オートマチックモード
         pfstart() から pfend() の間の処理は、ごく普通にカレント
        ディレクトリのファイルを読むように、parファイル内のファイ
        ルを読み込むことができます。
         このため、 固定データファイルを沢山必要とするプログラム
        は、プログラムはこの2関数を呼ぶ行を追加するだけで、
        par.exe によってひとつのparファイルにまとめることができま
        す。
         この機能は、書き込みオープン時には無効です。
         seekは、offset値が負であるときはかならず失敗します。
         同時に複数のファイルを開くことはできません。

------------------------------------------------------------------------
□ 構造体/グローバル変数

unsigned char pfkey;     暗号化されているファイルをアクセスする
                        ときに、この変数が復号化キーとなる。
                        pfopen()をコールする前に利用者が設定して
                        おく。 暗号化されていないファイルをアクセ
                        スするときは設定不要。

enum pferr pferrno;      pf.lib内で検出したエラーの種類がセット
                        される。 返却値ではエラーの有無しか分から
                        ないが、 この変数を読むことで詳細を知るこ
                        とができる。 エラーを検出していない場合の
                        値は不定。 pfopen(),  bopenr(), bopenw(),
                        bdopen() でセットされる。

------------------------------------------------------------------------
□ 定数

        ● pferrnoに格納される値
        表記            値   意味
        PFENOTOPEN        1  ファイルをオープンできない
        PFENOTFOUND       2  ファイルが parファイル中にない
        PFENOMEM          3  メモリを確保できない
        PFEUNKOWN         5  未知のファイルタイプ
        PFEILPFILE        6  ファイルが par形式でない
        PFEILEXE          7  EXEファイルが不正
        PFEINTERNAL     255  内部エラー

------------------------------------------------------------------------
□ pfcloser - parファイルのクローズ

C:      void pfcloser(pf_t hpf);

        ------------------------------------------98N 98H AT DOS-
        pfcloser                                             ○
        --------------------------------------------

                ● pfopen()でオープンしたファイルをクローズします。
                   pfopen()で確保された領域を開放しているので、必
                   ず呼んでください。

------------------------------------------------------------------------
□ pfend - pfオートマチックモード終了

C:      void pfend(void);

        ------------------------------------------98N 98H AT DOS-
        pfend                                                ○
        --------------------------------------------


                ● オートマチックモードを終了します。

                ○ 参照:  pfstart()

------------------------------------------------------------------------
□ pfgetc - parファイルから1文字読み込みます

C:      int pfgetc(pf_t hpf);

        ------------------------------------------98N 98H AT DOS-
        pfgetc                                               ○
        ---------------------------------------------

                ● ファイルから 1文字読み込んで返します。ファイル
                   の終わりに達しているときは -1を返します。

------------------------------------------------------------------------
□ pfgetw - parファイルから2バイト整数を読み込む

C:      int pfgetw(pf_t hpf);

        ------------------------------------------98N 98H AT DOS-
        pfgetw                                               ○
        ---------------------------------------------

                ● ファイルから 2バイト整数を読み込んで返します。
                   エラーは判別できません。

------------------------------------------------------------------------
□ pfopen - parファイルのオープン

C:      pf_t pfopen(const char *parfile, const char *file);

        ------------------------------------------98N 98H AT DOS-
        pfopen                                               ○
        ---------------------------------------------

                ● parファイル中にパックされているファイルを読込
                   み用にオープンします。
                    管理構造体を hmem_allocbyteで確保し、 そのセ
                   グメントアドレスを返します。

                ← parfile   parファイル名
                   file      parファイル内の読みたいファイル名

                → 0      エラー。pferrno  にエラー種別が設定され
                          る。
                   0以外  成功。この値は以後の  pf*()で使用するこ
                          と。

                ○ 暗号化されているファイルをオープンするときは、
                   この関数を使う前に、グローバル変数 pfkeyに暗号
                   キーを設定しておいてください。

                △MEMORY: 32バイトの管理構造体を確保します。また、
                  内部で bopenr を呼び出しているので、 そこでさら
                  にメモリが確保されます。

------------------------------------------------------------------------
□ pfread - parファイルからの読み込み

C:      unsigned pfread(void far *buf, unsigned size, pf_t hpf);

        ------------------------------------------98N 98H AT DOS-
        pfread                                               ○
        ---------------------------------------------

                ● ファイルから bufで指定された領域に  sizeバイト
                   読み込みます。実際に読み込んだバイト数を返しま
                   す。

------------------------------------------------------------------------
□ pfrewind - parファイルの読み込み位置を先頭に戻す

C:      void pfrewind(pf_t pf);

        ------------------------------------------98N 98H AT DOS-
        pfrewind                                             ○
        -------------------------------------------

                ● ファイルの読込み位置を先頭に戻します。

------------------------------------------------------------------------
□ pfseek - parファイルの読み込み位置を進める

C:      unsigned long pfseek(pf_t hpf, unsigned offset);

        ------------------------------------------98N 98H AT DOS-
        pfseek                                               ○
        ---------------------------------------------

                ● ファイルの読み込み位置を offsetバイト進めます。

                → 実行後の読み込み位置

                ★ この関数は、ファイル先頭に向かって戻ることはで
                   きません。戻るためには、pfrewind()を併用してく
                   ださい。

------------------------------------------------------------------------
□ pfstart - pfオートマチックモード開始

C:      void pfstart(const char *parfile);

        ------------------------------------------98N 98H AT DOS-
        pfstart                                              ○
        --------------------------------------------

                ● parファイル  parfileを対象としてオートマチック
                   モードを開始します。

                ★ プログラム終了までに必ず pfend()  を実行してく
                   ださい。実行しないと暴走します。
                ○ オートマチックモードについては pf_auto.txt  を
                   参照してください。

                ○ 参照:  pfend()

------------------------------------------------------------------------
□ pftell - parファイルの読み込み位置を得る

C:      unsigned long pftell(pf_t pf);                     マクロ

        ------------------------------------------98N 98H AT DOS-
        pftell                                               ○
        -----------------------------------------------------<->-

                ● ファイルの現在の読込み位置を得ます。


------------------------------------------------------------------------
■ MS-DOS一般 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

        MS-DOS のファンクションコールを呼び出す関数群です。
        MS-DOSの知識があると便利です。

------------------------------------------------------------------------
□ 構造体/グローバル変数


struct find_many_t {            dos_findmanyで格納されるレコード
    unsigned long time;         ファイルのタイムスタンプ(DOS形式)
    unsigned long size;         ファイルの大きさ
    char name[13];              ファイル名
    char attribute;             ファイル属性
};

------------------------------------------------------------------------
□ dos_absread - セクタ指定によるディスク読み込み

C:      void dos_absread( int drive, void far *buf, int pow, long sector );

        ------------------------------------------98N 98H AT DOS-
        dos_absread                                          5
        -------------------------------------------

                ● INT 25Hを呼び出します。

------------------------------------------------------------------------
□ dos_abswrite - セクタ指定によるディスク書き込み

C:      void dos_abswrite( int drive, void far *buf, int pow, long sector );

        ------------------------------------------98N 98H AT DOS-
        dos_abswrite                                         5
        -------------------------------------------

                ● INT 26Hを呼び出します。

------------------------------------------------------------------------
□ dos_allocate - メモリブロックの確保

C:      unsigned dos_allocate( unsigned para );

        ------------------------------------------98N 98H AT DOS-
        dos_allocate                                         5
        -------------------------------------------

                ● MS-DOSからメインメモリを確保します。

                ← para  確保するパラグラフサイズ(1=16バイト)

                → 0      メモリ不足
                   0以外  確保したセグメントアドレス

------------------------------------------------------------------------
□ dos_axdx - 文字列を渡してMS-DOSを呼ぶ

C:      long dos_axdx( int axval, const char * strval );

        ------------------------------------------98N 98H AT DOS-
        dos_axdx                                             ○
        ------------------------------------------

                ● 文字列を渡して MS-DOS ファンクションコールを実
                   行します。

                ← axval   AXに入れる値
                   strval  DS:DXに入れる文字列

                → 0以上  下位16bit=実行後のAXの値
                   負数   エラー( super.libエラーコード )

------------------------------------------------------------------------
□ dos_chdir - カレントディレクトリの設定

C:      int dos_chdir( const char * path );

        ------------------------------------------98N 98H AT DOS-
        dos_chdir                                            5
        -------------------------------------------

                ● カレントディレクトリを変更します。

                → 1  成功
                   0  失敗

------------------------------------------------------------------------
□ dos_close - ファイルを閉じる

C:      int dos_close( int fh );

        ------------------------------------------98N 98H AT DOS-
        dos_close                                            5
        -------------------------------------------

                ● ファイルを閉じます。

                ← fh    ファイルハンドル

                → NoError      成功
                   InvalidData  ハンドルが無効

                ★ Symantec C++  6.1Jにある同名関数を呼ぶときは、
                   (dos_close)(fh);などのように、関数名を括弧で括
                   ってください。

------------------------------------------------------------------------
□ dos_copy - ファイルのコピー

C:      int dos_copy( int src_fd, int dest_fd, unsigned long copy_len );

        ------------------------------------------98N 98H AT DOS-
        dos_copy                                             5
        --------------------------------------------

                ● ファイルの一部分または残り全てをコピーします。

                ← src_fd    コピー元ハンドル
                   dest_fd   コピー先ハンドル
                   copy_len  コピーしたい長さ。
                             COPY_ALL(0xffffffffL) ならば EOFまで。

                → NoError         成功
                   GeneralFailure  src_fd の長さが copy_len  に満
                                   たない
                   GeneralFailure  dest_fd が完全に書き込めなかっ
                                   た(ディスク不足?)
                   InsufficientMemory  メモリ不足
                   AccessDenied    どちらかの fd がアクセス拒否
                   InvalidHandle   どちらかの fd が無効

------------------------------------------------------------------------
□ dos_cputp - 高速なコンソールパスカル文字列出力

C:      void dos_cputp( const char * passtr );

        ------------------------------------------98N 98H AT DOS-
        dos_cputp                                            5
        -------------------------------------------

                ● int 29hを用いて文字列を表示します。
                   MS-DOSのバージョン変更によって使えなくなる可能
                   性があります。(DOS5ではOK)

                ★ リダイレクトは効きません。

------------------------------------------------------------------------
□ dos_cputs - 高速なコンソール文字列出力

C:      void dos_cputs( const char * string );

        ------------------------------------------98N 98H AT DOS-
        dos_cputs                                            5
        -------------------------------------------

                ● int 29hを用いて文字列を表示します。
                   MS-DOSのバージョン変更によって使えなくなる可能
                   性があります。(DOS5ではOK)

                ★ リダイレクトは効きません。

------------------------------------------------------------------------
□ dos_cputs2 - 改行文字変換付きコンソール文字列出力

C:      void dos_cputs2( const char * str );

        ------------------------------------------98N 98H AT DOS-
        dos_cputs2                                           5
        -------------------------------------------

                ● int 29hを用いて文字列を表示します。
                   MS-DOSのバージョン変更によって使えなくなる可能
                   性があります。(DOS5ではOK)
                   "\n"を、"\r\n"に変換して出力します。 (MSC/TCな
                   どのテキストと同じ)

                ★ リダイレクトは効きません。

------------------------------------------------------------------------
□ dos_create - ファイルの作成

C:      int dos_create( const char * filename, int attribute );

        ------------------------------------------98N 98H AT DOS-
        dos_create                                           5
        -------------------------------------------

                ● ファイルを作成し、オープンします。

                ← filename   作成するパス名
                   attribute  属性。通常は 0x20

                → 0以上             成功,ファイルハンドル
                   PathNotFound      失敗,パスが無効
                   TooManyOpenFiles  失敗,オープンファイルが多す
                                     ぎる
                   AccessDenied      失敗,属性が無効

------------------------------------------------------------------------
□ dos_filesize - ファイルサイズの取得

C:      long dos_filesize( int fh );

        ------------------------------------------98N 98H AT DOS-
        dos_filesize                                         5
        -------------------------------------------

                ● ファイルハンドルの表すファイルの大きさを得ます。

                ← fh  ファイルハンドル

                → InvalidHandle  ハンドルが無効
                   以外           ファイルの大きさ

------------------------------------------------------------------------
□ dos_findfirst - 最初に一致するファイルの検索

C:      int dos_findfirst( const char far * path, int attribute );

        ------------------------------------------98N 98H AT DOS-
        dos_findfirst                                        5
        --------------------------------------------

                ● ファイルを検索し、dos_setdta()で設定したアドレ
                   スに検索結果を書き込みます。

                ← path       検索するパス(ワイルドカードを含む)
                   attribute  許可属性

                → 1  存在
                   0  不在またはエラー

------------------------------------------------------------------------
□ dos_findmany - 一度に複数のファイル検索

C:      unsigned dos_findmany( const char far * path,
                              int attribute, struct   find_many_t
                              far * buffer, unsigned max_dir );

        ------------------------------------------98N 98H AT DOS-
        dos_findmany                                         ○
        -------------------------------------------

                ● 最大数を指定してファイル名を検索し、配列に格納
                   します。

                ← path       検索パス名
                   attribute  検索属性
                   buffer     格納先(配列)
                   max_dir    最大個数, 1以上。  0は1に補正して実
                              行されます。

                → 1以上  bufferに書き込んだ個数
                   0      存在しないか、エラー

------------------------------------------------------------------------
□ dos_findnext - 次に一致するファイルの検索

C:      int dos_findnext(void);

        ------------------------------------------98N 98H AT DOS-
        dos_findnext                                         5
        --------------------------------------------

                ● dos_findfirst()の続きを一つ検索します。

                → 1  存在
                   0  もう無い

------------------------------------------------------------------------
□ dos_free - メモリブロックの開放

C:      void dos_free( unsigned seg );

        ------------------------------------------98N 98H AT DOS-
        dos_free                                             5
        --------------------------------------------

                ● DOSによって確保されているメモリブロックを開放
                   します。

                ← seg  DOSメモリブロックのセグメントアドレス

                ○ mem_free関数の別名です。

                ★ Symantec C++  6.1Jにある同名関数を呼ぶときは、
                   (dos_free)(seg);などのように、関数名を括弧で括
                   ってください。

------------------------------------------------------------------------
□ dos_get_argv0 - 起動パス名を得る

C:      void dos_get_argv0( char * argv0 );

        ------------------------------------------98N 98H AT DOS-
        dos_get_argv0                                        ○
        -------------------------------------------

                ● プログラムの起動パス名を得ます。main()が呼ばれ
                   るときの引数、argv[0]に得られるものと同じです。

                ← argv0  格納先。長さは256バイト程度確保されてい
                          ること。

                ★ DOS 3.X以降でなければ argv[0] = '\0'  となりま
                   す。

------------------------------------------------------------------------
□ dos_getch - ^Cで止まらない文字入力

C:      int dos_getch(void);

        ------------------------------------------98N 98H AT DOS-
        dos_getch                                            5
        -------------------------------------------

                ● 標準入力から文字を読みます。
                   MS-DOSの BREAK OFFが行われていれば、^Cチェック
                   がされません。
                   入力がなければ、入力があるまで待ちます。

------------------------------------------------------------------------
□ dos_getcwd - カレントディレクトリの読み出し

C:      int dos_getcwd( int drive, char * buf );

        ------------------------------------------98N 98H AT DOS-
        dos_getcwd                                           5
        -------------------------------------------

                ● 指定ドライブのカレントディレクトリ文字列を得ま
                   す。
                   ドライブは、0 = カレントディレクトリ、
                   1 = A: ... という対応になっています。
                   'a'や'A'でもA:を指定できます。
                   bufに、"A:\ABC\DEF"の形で書き込まれます。
                   bufのサイズは、DOS3.xの場合 68バイト, DOS5.xの
                   場合 132バイト必要です。

                → 1  成功
                   0  失敗

------------------------------------------------------------------------
□ dos_getdiskfree - ディスクの残り容量の読み出し

C:      long dos_getdiskfree( int drive );

        ------------------------------------------98N 98H AT DOS-
        dos_getdiskfree                                      5
        -------------------------------------------

                ● ディスクの残り容量をバイト数で得ます。
                   ドライブは、
                   0 = カレントディレクトリ
                   1 = A: ... という対応になっています。
                   'a'や'A'でもA:を指定できます。

                → -1   失敗
                   0~  残りバイト数

                ★ この関数のみ、目的のドライブが存在しない場合も
                   直接失敗します。画面にDOSのメッセージ(中止
                   (A)...のような)が出ません。このため、 メディア
                   存在検査にも使えるようになっています。

------------------------------------------------------------------------
□ dos_getdrive - カレントドライブを得る

C:      int dos_getdrive(void);

        ------------------------------------------98N 98H AT DOS-
        dos_getdrive                                         5
        -------------------------------------------

                ● カレントドライブ番号を得ます。

                → 0 = A:
                   1 = B:
                   ...

                ★ Symantec C++  6.1Jにある同名関数を呼ぶときは、
                   (dos_getdrive)(&d);などのように、 関数名を括弧
                   で括ってください。

------------------------------------------------------------------------
□ dos_get_driveinfo - ディスク容量を得る

C:      int dos_get_driveinfo(  int  drive,  unsigned   *cluster,
                              unsigned *sector, unsigned *bytes );

        ------------------------------------------98N 98H AT DOS-
        dos_get_driveinfo                                    5
        -------------------------------------------

                ● ディスクの容量に関するデータを得ます。

                ← drive    (0=カレント, 1=A: ...  'a'や'A'でもA:
                            として指定できます)
                   cluster  ドライブのクラスタ数
                   sector   1クラスタあたりのセクタ数
                   bytes    1セクタあたりのバイト数

                → 0    成功
                   -1   ドライブの指定が無効

------------------------------------------------------------------------
□ dos_getenv - 環境変数を得る

C:      const char far * dos_getenv( unsigned envseg, char * envname );

        ------------------------------------------98N 98H AT DOS-
        dos_getenv                                           5
        -------------------------------------------

                ● 環境変数の値を直接得ます。

                ← envseg   環境変数領域の先頭セグメントアドレス
                            (0ならば現在のプロセスの環境変数)
                   envname  環境変数名

                → 環境変数の内容の先頭アドレス(C言語文字列)
                   または 0 (見つからない)

                ★ これで得られるのは実際の環境変数の値の先頭アド
                   レスであり、書き換えると危険です。

------------------------------------------------------------------------
□ dos_getkey - 入力を待たない文字入力

C:      int dos_getkey(void);

        ------------------------------------------98N 98H AT DOS-
        dos_getkey                                           5
        -------------------------------------------

                ● 標準入力から文字を読みます。
                   MS-DOSの BREAK OFFが行われていれば、^Cチェック
                   がされません。
                   CTRL+@と入力なしの区別ができません。

                → 1~255  入力された文字
                   0       入力なし

------------------------------------------------------------------------
□ dos_getkey2 - 入力を待たない文字入力(2)

C:      int dos_getkey2(void);

        ------------------------------------------98N 98H AT DOS-
        dos_getkey2                                          5
        -------------------------------------------

                ● 標準入力から文字を読みます。
                   MS-DOSの BREAK OFFが行われていれば、^Cチェック
                   がされません。
                   CTRL+@と入力なしの区別ができます。

                → 0~255  入力された文字
                   -1      入力なし

------------------------------------------------------------------------
□ dos_gets - 文字列の入力(編集なし)

C:      int dos_gets( char *buffer, int max );

        ------------------------------------------98N 98H AT DOS-
        dos_gets                                             5
        --------------------------------------------

                ● DOSのバッファドキーボード入力を実行します。

                ← buffer  バッファの先頭アドレス。バッファは次の
                           構造です。
                     buffer[0] ダミー
                     buffer[1] 入力結果の文字数が入る。呼び出し時
                               点ではダミー。
                     buffer[2~2+max-1]  入力結果が入る。  末尾は
                               '\r'である点に注意。 ('\0'ではない
                               ので、読む時には注意が必要です)

                   max     最大文字数('\r'も含みます)。bufferは、
                           max+2バイト確保してください。

                → 入力された文字数

------------------------------------------------------------------------
□ dos_get_verify - ベリファイフラグの読み取り

C:      int dos_get_verify(void);

        ------------------------------------------98N 98H AT DOS-
        dos_get_verify                                       5
        -------------------------------------------

                ● DOSのディスクアクセスのベリファイフラグの値を
                   得ます。

                → 0      ベリファイなし
                   0以外  ベリファイあり

                ★ Symantec C++  6.1Jにある同名関数を呼ぶときは、
                   (dos_get_verify)();などのように、 関数名を括弧
                   で括ってください。

------------------------------------------------------------------------
□ dos_ignore_break - ^Cを無視する設定をする

C:      void dos_ignore_break(void);

        ------------------------------------------98N 98H AT DOS-
        dos_ignore_break                                     5
        -------------------------------------------

                ● MS-DOS が ^Cを検出し、^C表示をした後に、プログ
                   ラム中断がされないようにします。

                ★ プログラムが終了すると、 DOSは自動的にこの設定
                   を呼び出し前の状態に戻します。

------------------------------------------------------------------------
□ dos_keyclear - キーバッファの消去

C:      void dos_keyclear(void);

        ------------------------------------------98N 98H AT DOS-
        dos_keyclear                                         5
        -------------------------------------------

                ● 標準入力に溜っているデータを消去します。

------------------------------------------------------------------------
□ dos_makedir - 深いサブディレクトリの作成

C:      int dos_makedir( const char * path );

        ------------------------------------------98N 98H AT DOS-
        dos_makedir                                          5
        -------------------------------------------

                ● 一度に多層のサブディレクトリを作成します。

                → 1  成功(すでに存在する場合も成功)
                   0  失敗(ディスクに空きがない/パスが無効)
                      途中で失敗した場合、 途中までのディレクトリ
                      が作成されている場合があります。

                ★ 現状では、ルートディレクトリが満杯のときに、ル
                   ートディレクトリの直下に一層だけ作成しようとす
                   ると、失敗しているのに成功として返します。

------------------------------------------------------------------------
□ dos_maxfree - 最大空きメモリブロックサイズの取得

C:      unsigned dos_maxfree(void);

        ------------------------------------------98N 98H AT DOS-
        dos_maxfree                                          5
        -------------------------------------------

                ● DOSの空きメモリブロックのうち、 最大のものの大
                   きさをパラグラフ単位で得ます。

------------------------------------------------------------------------
□ dos_mkdir - サブディレクトリの作成

C:      int dos_mkdir( const char * path );

        ------------------------------------------98N 98H AT DOS-
        dos_mkdir                                            5
        -------------------------------------------

                ● サブディレクトリを作成します。

                → 1  成功
                   0  失敗(ディスクに空きがない/パスが無効)

------------------------------------------------------------------------
□ dos_move - ディレクトリエントリの移動

C:      int dos_move( const char far * source, const char far * dest );

        ------------------------------------------98N 98H AT DOS-
        dos_move                                             5
        --------------------------------------------

                ● ディレクトリエントリ(ファイル,ディレクトリなど)
                   の所在を移動します。移動が成功すると、移動元は
                   なくなります。

                ← source 移動元の存在するパス名
                   dest   移動先のパス名

                → 1  成功
                   0  失敗

                ★ source,destが共に同じ物理ドライブに無いと移動
                   できません。また、移動先にすでにファイルなどが
                   存在しても移動できません。

------------------------------------------------------------------------
□ dos_putc - ^Cで止まらない文字出力

C:      void dos_putc( int c );

        ------------------------------------------98N 98H AT DOS-
        dos_putc                                             5
        --------------------------------------------

                ● 標準出力へ1文字出力します。
                   MS-DOSの BREAK OFFが行われていれば、^Cチェック
                   がされません。

------------------------------------------------------------------------
□ dos_putch - 高速なコンソール文字出力

C:      void dos_putch( int chr );

        ------------------------------------------98N 98H AT DOS-
        dos_putch                                            5
        -------------------------------------------

                ● int 29hを用いて文字を表示します。
                   MS-DOSのバージョン変更によって使えなくなる可能
                   性があります。(DOS5ではOK)

                ★ リダイレクトは効きません。

------------------------------------------------------------------------
□ dos_putp - パスカル文字列出力

C:      void dos_putp( const char * passtr );

        ------------------------------------------98N 98H AT DOS-
        dos_putp                                             5
        --------------------------------------------

                ● 標準出力へ文字列を出力します。

------------------------------------------------------------------------
□ dos_puts - 文字列出力

C:      void dos_puts( const char * str );

        ------------------------------------------98N 98H AT DOS-
        dos_puts                                             5
        --------------------------------------------

                ● 標準出力へ文字列を出力します。

------------------------------------------------------------------------
□ dos_puts2 - 改行文字変換付き文字列出力

C:      void dos_puts2( const char * str );

        ------------------------------------------98N 98H AT DOS-
        dos_puts2                                            5
        -------------------------------------------

                ● 標準出力へ文字列を出力します。
                   "\n"を、"\r\n"に変換して出力します。 (MSC/TCな
                   どのテキストと同じ)

------------------------------------------------------------------------
□ dos_read - ファイルの読み込み

C:      int dos_read( int fh, void far * buffer, unsigned len );

        ------------------------------------------98N 98H AT DOS-
        dos_read                                             5
        --------------------------------------------

                ● ファイルから読み込みます。

                ← fh      ファイルハンドル
                   buffer  読み込み先の先頭アドレス
                   len     転送するバイト数

                → 0~            実際に読み込んだバイト数
                   AccessDenied   読み込み許可されていない
                   InvalidHandle  ハンドルがオープンされていない

------------------------------------------------------------------------
□ dos_rmdir - サブディレクトリの削除

C:      int dos_rmdir( const char * path );

        ------------------------------------------98N 98H AT DOS-
        dos_rmdir                                            5
        -------------------------------------------

                ● サブディレクトリを削除します。

                → 1  成功
                   0  失敗(存在しない/中に何かある/カレントディレ
                      クトリ)

------------------------------------------------------------------------
□ dos_ropen - ファイルの読み込みオープン

C:      int dos_ropen( const char * filename );

        ------------------------------------------98N 98H AT DOS-
        dos_ropen                                            5
        ----------------------------------

                ● 読み込み用にファイルを開きます。

                → FileNotFound  開けない
                   0以上         ファイルハンドル

------------------------------------------------------------------------
□ dos_seek - ファイルポインタの移動

C:      long dos_seek( int fh, long offs, int mode );

        ------------------------------------------98N 98H AT DOS-
        dos_seek                                             5
        --------------------------------------------

                ● ファイルポインタを移動します。

                ← fh    ファイルハンドル
                   offs  移動量
                   mode  移動の起点 (  0:ファイル先頭, 1:現在位置,
                                       2:ファイル末尾 )

                → 移動後のファイル先頭からの位置

------------------------------------------------------------------------
□ dos_setbreak - ブレーク検査フラグの読み取りと設定

C:      int dos_setbreak( int breakon );

        ------------------------------------------98N 98H AT DOS-
        dos_setbreak                                         5
        --------------------------------------------

                ● DOSファンクションコール呼び出し時点で   CTRL+C
                   (STOP, Ctrl+Break)が押されていたらプログラムを
                   強制終了させる機能の制御をします。

                ← breakon   1  ブレーク検査をする
                             0  ブレーク検査をしない

                → 以前に設定されていたフラグ

------------------------------------------------------------------------
□ dos_setdrive - カレントドライブの設定

C:      int dos_setdrive( int drive );

        ------------------------------------------98N 98H AT DOS-
        dos_setdrive                                         5
        -------------------------------------------

                ● カレントドライブ番号を設定します。
                   0 = A:
                   1 = B:
                   ... という対応になっています。
                   'a'や'A'でもA:を指定できます。

                → 接続されているドライブの数 ( config.sysの
                   LASTDRIVE による)

                ★ Symantec C++  6.1Jにある同名関数を呼ぶときは、
                   (dos_setdrive)(d,&a);などのように、 関数名を括
                   弧で括ってください。

------------------------------------------------------------------------
□ dos_setdta - ディスク転送アドレスの設定

C:      void dos_setdta( void far * dta );

        ------------------------------------------98N 98H AT DOS-
        dos_setdta                                           5
        -------------------------------------------

                ● dos_findfirst/dos_findnextの検索結果を格納する
                   アドレスを設定します。

                ← dta   ディスク転送アドレス。struct find_t a;と
                         して検索結果領域を用意した場合、ここには
                         &a を入れます。

------------------------------------------------------------------------
□ dos_setvect - 割り込みベクタの読み取りとフック

C:      void (interrupt far * dos_setvect( int vect,
                                          void (interrupt far
                                          *address)()))();

        ------------------------------------------98N 98H AT DOS-
        dos_setvect                                          5
        --------------------------------------------

                ● 割り込みベクタの以前の値を取得し、代わりに新し
                   い値を設定します。

                ← vect     0~255, 割り込みベクタ番号
                   address  新しいルーチンの先頭アドレス

                → 以前に設定されていたアドレス

                ★ Cの宣言がややこしいですが、int型と割り込み関数
                   へのポインタを引数に取り、割り込み関数へのポイ
                   ンタを返す関数です。

                例:
                  void interrupt far new_func(void) {
                    /* 新しい割り込みベクタでの処理 */
                  }
                  /* 保存用関数ポインタ変数 */
                  void (interrupt far *old_func)();

                  ・割り込みベクタ VECTOR に new_funcをフックし、
                    以前のアドレスを保存
                  old_func = dos_setvect( VECTOR, new_func );

                  ・保存された、以前のアドレスに復元する
                  dos_setvect( VECTOR, old_func );

------------------------------------------------------------------------
□ dos_set_verify_off - ベリファイOFF

C:      void dos_set_verify_off(void);

        ------------------------------------------98N 98H AT DOS-
        dos_set_verify_off                                   5
        -------------------------------------------

                ● DOSのディスクアクセスのベリファイを行わないよ
                   うに設定します。

------------------------------------------------------------------------
□ dos_set_verify_on - ベリファイON

C:      void dos_set_verify_on(void);

        ------------------------------------------98N 98H AT DOS-
        dos_set_verify_on                                    5
        -------------------------------------------

                ● DOSのディスクアクセスのベリファイを行うように
                   設定します。

------------------------------------------------------------------------
□ dos_write - ファイルの書き込み

C:      int dos_write( int fh, const void far * buffer, unsigned len );

        ------------------------------------------98N 98H AT DOS-
        dos_write                                            5
        -------------------------------------------

                ● ファイルへ書き込みます。

                ← fh      ファイルハンドル
                   buffer  書き込むデータの先頭アドレス
                   len     転送するバイト数

                → 0~            実際に書き込んだバイト数
                   AccessDenied   書き込み許可されていない
                   InvalidHandle  ハンドルがオープンされていない


------------------------------------------------------------------------
■ RSL(常駐symbolic link)制御 ■■■■■■■■■■■■■■■■■■■■■

        恋塚氏(って俺か)の "RSL" を利用する関数群です。
        詳しくは RSL のドキュメント rsl.doc を参照のこと~
        ちなみにすべてのAPIを実装しているわけではありません。
        なお、RSLのバージョンは 007以降を対象としています。

------------------------------------------------------------------------
□ 定数

        ● rsl_linkmode()の引数
        表記            値      意味
        RSL_NOCONVERT   1       ファイル検索結果をすりかえない
        RSL_CONVERT     0       ファイル検索結果をすりかえる(デフ
                                ォルト)

------------------------------------------------------------------------
□ rsl_exist - RSLの常駐検査

C:      int rsl_exist(void);

        ------------------------------------------98N 98H AT DOS-
        rsl_exist                                            ○
        ------------------------------------------------

                ● RSLの常駐検査をします。rsl_*関数を使うまえに、
                   最初に実行する必要があります。
                   これによって存在を検出できなかった場合と、この
                   関数を実行しなかった場合、 rsl_*()関数はまった
                   くの無動作となります。

                → 1  rslが常駐している
                   0  rslは常駐していない

------------------------------------------------------------------------
□ rsl_linkmode - シンボリックリンク変換モードの設定

C:      int rsl_linkmode( unsigned mode );

        ------------------------------------------98N 98H AT DOS-
        rsl_linkmode                                         ○
        ------------------------------------------------

                ● ファイル検索時に、シンボリックリンクが検索され
                   た場合に自動的にリンク先にすりかえるかどうかを
                   指定します。

                ← mode  RSL_CONVERT    すりかえる(デフォルト)
                         RSL_NOCONVERT  すりかえない

                → 0  RSLが存在しない
                   1  成功


------------------------------------------------------------------------
□ rsl_readlink - シンボリックリンクの読み取り

C:      int rsl_readlink( char * buf, const char * path );

        ------------------------------------------98N 98H AT DOS-
        rsl_readlink                                         ○
        ------------------------------------------------

                ● 指定のパスがシンボリックリンクだった場合、 buf
                   にその差す先のパス名を返します。

                ← buf   取得するパス名の格納先
                   path  シンボリックリンクのパス名

                → 0  RSLが存在しないか、pathがシンボリックリンク
                      ではない
                   1  リンク先のパス名文字列が得られた


------------------------------------------------------------------------
■ 入力・操作関係 ■■■■■■■■■■■■■■■■■■■■■■■■■■■


------------------------------------------------------------------------
■ キーボード関係 ■■■■■■■■■■■■■■■■■■■■■■■■■■■

        キー入力などを簡便に管理するための関数群です。

------------------------------------------------------------------------
□ 構造体/グローバル変数

        ● キー割り当て構造体です。このグローバル変数を変更すると、
           その時点から key_wait, key_scan などが新しい値にしたが
           った値を返すようになります。
typedef struct KEYTABLE KEYTABLE;
struct KEYTABLE {
        unsigned rollup, rolldown, ins, del, up, left, right, down;
        unsigned homeclr, help, s_homeclr;
};
extern KEYTABLE key_table_normal, key_table_alt;
extern KEYTABLE key_table_shift,  key_table_ctrl;

        ● キー書き戻しバッファ。key_back()参照
unsigned key_back_buffer;

------------------------------------------------------------------------
□ 定数

        ● シフトキー押し下げ状態ビット ( key_shift )
        表記    値      キー
        K_SHIFT 1       [Shift]が押されている
        K_CAPS  2       Capsロック
        K_KANA  4       カナロック
        K_GRPH  8       [GRPH]または[Alt]が押されている
        K_CTRL  16      [CTRL]が押されている

        ● デフォルトでkey_scanが返す値 ( key_table... )
        表記            値              操作
        ---------------------------------------------
        CTRL(c)         (c-'@')         [CTRL]+c
        K_HELP          0x100           [HELP]
        K_UP            CTRL('E')       [↑]
        K_LEFT          CTRL('S')       [←]
        K_RIGHT         CTRL('D')       [→]
        K_DOWN          CTRL('X')       [↓]
        K_S_UP          CTRL('R')       [SHIFT]+[↑]
        K_S_LEFT        CTRL('A')       [SHIFT]+[←]
        K_S_RIGHT       CTRL('F')       [SHIFT]+[→]
        K_S_DOWN        CTRL('C')       [SHIFT]+[↓]
        K_ROLLUP        CTRL('C')       [ROLL UP]
        K_ROLLDOWN      CTRL('R')       [ROLL DOWN]
        K_DEL           CTRL('G')       [DEL]
        K_HOMECLR       CTRL('Y')       [HOME/CLR]
        K_CLR           CTRL('@')       [SHIFT]+[HOME/CLR]
        K_BS            CTRL('H')       [BS]
        K_TAB           CTRL('I')       [TAB]
        K_INS           CTRL('V')       [INS]
        K_ESC           CTRL('[')       [ESC]
        K_CR            CTRL('M')       リターンキー
        K_F1            0x101           [f・1]
        K_F2            0x102           [f・2]
        K_F3            0x103           [f・3]
        K_F4            0x104           [f・4]
        K_F5            0x105           [f・5]
        K_F6            0x106           [f・6]
        K_F7            0x107           [f・7]
        K_F8            0x108           [f・8]
        K_F9            0x109           [f・9]
        K_F10           0x10a           [f・10]
        K_S_F1          0x10b           [SHIFT]+[f・1]
        K_S_F2          0x10c           [SHIFT]+[f・2]
        K_S_F3          0x10d           [SHIFT]+[f・3]
        K_S_F4          0x10e           [SHIFT]+[f・4]
        K_S_F5          0x10f           [SHIFT]+[f・5]
        K_S_F6          0x110           [SHIFT]+[f・6]
        K_S_F7          0x111           [SHIFT]+[f・7]
        K_S_F8          0x112           [SHIFT]+[f・8]
        K_S_F9          0x113           [SHIFT]+[f・9]
        K_S_F10         0x114           [SHIFT]+[f・10]
        K_VF1           0x120           [vf・1]
        K_VF2           0x121           [vf・2]
        K_VF3           0x122           [vf・3]
        K_VF4           0x123           [vf・4]
        K_VF5           0x124           [vf・5]
        K_S_VF1         0x125           [SHIFT]+[vf・1]
        K_S_VF2         0x126           [SHIFT]+[vf・2]
        K_S_VF3         0x127           [SHIFT]+[vf・3]
        K_S_VF4         0x128           [SHIFT]+[vf・4]
        K_S_VF5         0x129           [SHIFT]+[vf・5]
        K_C_F1          0x12a           [CTRL]+[f・1]
        K_C_F2          0x12b           [CTRL]+[f・2]
        K_C_F3          0x12c           [CTRL]+[f・3]
        K_C_F4          0x12d           [CTRL]+[f・4]
        K_C_F5          0x12e           [CTRL]+[f・5]
        K_C_F6          0x12f           [CTRL]+[f・6]
        K_C_F7          0x130           [CTRL]+[f・7]
        K_C_F8          0x131           [CTRL]+[f・8]
        K_C_F9          0x132           [CTRL]+[f・9]
        K_C_F10         0x133           [CTRL]+[f・10]
        K_C_VF1         0x134           [CTRL]+[vf・1]
        K_C_VF2         0x135           [CTRL]+[vf・2]
        K_C_VF3         0x136           [CTRL]+[vf・3]
        K_C_VF4         0x137           [CTRL]+[vf・4]
        K_C_VF5         0x138           [CTRL]+[vf・5]
        K_S_DEL         CTRL('T')       [SHIFT]+[DEL]
        K_C_UP          (CTRL('E')+0x200) [CTRL]+[↑]
        K_C_LEFT        (CTRL('S')+0x200) [CTRL]+[←]
        K_C_RIGHT       (CTRL('D')+0x200) [CTRL]+[→]
        K_C_DOWN        (CTRL('X')+0x200) [CTRL]+[↓]
        K_C_ROLLUP      (CTRL('C')+0x200) [CTRL]+[ROLL UP]
        K_C_ROLLDOWN    (CTRL('R')+0x200) [CTRL]+[ROLL DOWN]
        K_C_DEL         (CTRL('G')+0x200) [CTRL]+[DEL]
        K_C_INS         (CTRL('V')+0x200) [CTRL]+[INS]
        K_A_UP          (CTRL('E')+0x300) [GRPH]+[↑]
        K_A_LEFT        (CTRL('S')+0x300) [GRPH]+[←]
        K_A_RIGHT       (CTRL('D')+0x300) [GRPH]+[→]
        K_A_DOWN        (CTRL('X')+0x300) [GRPH]+[↓]
        K_A_ROLLUP      (CTRL('C')+0x300) [GRPH]+[ROLL UP]
        K_A_ROLLDOWN    (CTRL('R')+0x300) [GRPH]+[ROLL DOWN]
        K_A_DEL         (CTRL('G')+0x300) [GRPH]+[DEL]
        K_A_INS         (CTRL('V')+0x300) [GRPH]+[INS]

        ● シフトキー定数(vkey_shift)
        VK_RSHIFT       0x01    右シフト
        VK_LSHIFT       0x02    左シフト
        VK_SHIFT        (VK_RSHIFT|VK_LSHIFT)
        VK_CTRL         0x04    コントロールキー
        VK_ALT          0x08    全面キー
        VK_KANA         0x10    /* J3100 */
        VK_NUMLOCK      0x20    NumLockされている
        VK_CAPS         0x40    CapsLockされている

------------------------------------------------------------------------
□ key_back - キーバッファへの書き戻し

C:      void key_back(unsigned back_key);                  マクロ

        ------------------------------------------98N 98H AT DOS-
        key_back
        -----------------------------------------------------<->-

                ●  キーバッファ(key_back_buffer)に、1文字だけ書
                   き戻します。
                    次回の key_wait, key_scan, vkey_wait,
                   vkey_scan は、実際のキーバッファよりも先にここ
                   に書き込んだ値を返し、key_back_bufferを0にしま
                   す。

                ← back_key  0以外  書き戻す値
                             0      書き戻しをキャンセル

------------------------------------------------------------------------
□ key_beep_off - キーバッファフル音の禁止

C:      void key_beep_off(void);

        ------------------------------------------98N 98H AT DOS-
        key_beep_off                               ○  × ×
        --------------------------------------------

                ● BIOSでキーバッファが満杯の時にさらにキーが押さ
                   れた時に鳴らす音を禁止(鳴らなく)します。
                   通常は、鳴ります。

------------------------------------------------------------------------
□ key_beep_on - キーバッファフル音の許可

C:      void key_beep_on(void);

        ------------------------------------------98N 98H AT DOS-
        key_beep_on                                ○  × ×
        --------------------------------------------

                ● BIOSでキーバッファが満杯の時にさらにキーが押さ
                   れた時に鳴らす音を許可します。
                   通常は、鳴ります。

------------------------------------------------------------------------
□ key_end - 特殊キー読み取り設定の破棄

C:      void key_end(void);

        ------------------------------------------98N 98H AT DOS-
        key_end                                    ○  ○ × 5
        -------------------------------------------

                ● key_start の設定を実行前の値に戻します。

                ★ key_start を実行したら、終了時には必ずこの関数
                   を実行してください。

                ○ key_startが実行されていない状態で呼び出すと何
                   もしません。

------------------------------------------------------------------------
□ key_pressed - 先行入力の検査

C:      int key_pressed(void);

        ------------------------------------------98N 98H AT DOS-
        key_pressed                                          ○
        -------------------------------------------

                ● まだ取得していない有効なキー入力がなされている
                   かを判定します。

                → 1  キーバッファになにかある
                   0  キーバッファは空

                ○ kbhit() と同等の関数です。

------------------------------------------------------------------------
□ key_reset - キーボードインターフェイスのリセット

C:      void key_reset(void);

        ------------------------------------------98N 98H AT DOS-
        key_reset                                  ○     ×
        -------------------------------------------

                ● キーボードインターフェイスにリセットコマンドを
                   実行します。

                ○ この処理を実行することによって、キーボードリピ
                   ートのカウンタをリセットすることができます。が、
                   あまり意味がないかもしれません :-)

------------------------------------------------------------------------
□ key_scan - 特殊キーの読み取り

C:      unsigned key_scan(void);

        ------------------------------------------98N 98H AT DOS-
        key_scan                                   ○  ○ * 5
        -------------------------------------------

                ● キーバッファになにかあればそのコードを、なけれ
                   ば 0xffffを返します。
                   キーバッファからそのコードは抜き取られます。

                → 0xffff  なにも入力されていない
                   以外    入力されたキーの値 ( K_UP などの定数、
                           または文字コード )
                           特殊キーでなければ MS-DOS から入力する
                           のと同じです。

                ○ 特殊キーの値は、グローバル変数 key_table... に
                   書かれた値から返されます。この値を変更した途端
                   にキーアサインを変更することができます。

------------------------------------------------------------------------
□ key_sense - キーの押し下げ状態の取得

C:      int key_sense( int keygroup );

        ------------------------------------------98N 98H AT DOS-
        key_sense                                  ○     ×
        -------------------------------------------

                ● キーグループの現在のキー押下状態を取得します。
                    キーバッファとは無関係に動作するので、バッフ
                   ァフル音を key_beep_off によって消しておくべき
                   です。
                    キーリピートによって取り逃す恐れがあるので、
                   一回実行したあと2ms程度の間を置いて二回目を実
                   行して、両方の結果のorをとってください。

                ← keygroup  キーグループ
                             98の int 18h, ah = 04hに関する資料を
                             参照してください。

                → key押下状態

                ○ AH = 4, INT 18h を呼び出しています。

------------------------------------------------------------------------
□ key_sense_bios - BIOSによるキー入力のセンス

C:      unsigned key_sense_bios(void);

        ------------------------------------------98N 98H AT DOS-
        key_sense_bios                             ○  ○ *
        --------------------------------------------

                ● キーBIOS を用いて、 キー入力がすでにあればキー
                   コードを返し、押されていなければ0を返します。

                → 0           キー入力が為されていない
                   0以外
                     上位8bit  キーコード
                     下位8bit  キーデータ(キャラクタコード)

                ○ AH = 1, INT 18h を呼び出しています。

                ★ これを使うと、大抵の FEP は全く効きません。 ま
                   た、キー配列を換えている常駐ソフトが効かなかっ
                   たりします。押されたキーに対応する文字ではなく、
                   キーの位置に依存する場合にしか使わないほうが無
                   難でしょう。

------------------------------------------------------------------------
□ key_set_label - ファンクションキー表示内容の設定

C:      void key_set_label( int num, const char * lab );

        ------------------------------------------98N 98H AT DOS-
        key_set_label                              ○  ○ × 5
        -------------------------------------------

                ● ファンクションキーのラベルを設定します。

                ← num  1~10: F・1~F・10
                        11~20: SHIFT+F・1~SHIFT+F・10
                   lab  5文字の文字列

------------------------------------------------------------------------
□ key_shift - シフトキー状態の取得

C:      int key_shift(void);

        ------------------------------------------98N 98H AT DOS-
        key_shift                                  ○     *
        -------------------------------------------

                ● 現在押されているシフトキーの状態を、以下の定数
                   を足し合わせて返します。
                    判定するには、目的の定数との  AND(&)の結果が
                   0 でなければ押されている、としてください。

                        K_SHIFT 1
                        K_CAPS  2
                        K_KANA  4
                        K_GRPH  8
                        K_CTRL  16

------------------------------------------------------------------------
□ key_start - 特殊キー読み取りのための準備

C:      void key_start(void);

        ------------------------------------------98N 98H AT DOS-
        key_start                                  ○  ○ × 5
        -------------------------------------------

                ● key_scan,key_waitなどの準備(特殊キーの設定)を
                   します。また、ファンクションキーの表示文字列を
                   すべて空にします。

                ★ この関数を実行したら、 終了時には必ず  key_end
                   を実行してください。

                ○ この関数は、実行に時間が少しかかるので、キーを
                   取る度に  key_start(),key_scan(),key_end()のシ
                   ーケンスを実行するようなことは避けて、起動時に
                   key_start(),   処理中は  key_scan(),  終了時に
                   key_end()、 というふうに切り分けて使うようにし
                   てください。
                ○ すでに key_start が実行される場合は、 ファンク
                   ションキーおよび特殊キーの定義をやりなおします。

                ○ 以下の順に呼び出したときの動作:
                   key_start()   (1)ファンクションキーの待避、 キ
                                 ー割り当ての設定、 CTRL+ファンク
                                 ションキーのソフトキー化
                   key_start()   キー割当の再設定、 CTRL+ファンク
                                 ションキーのソフトキー化
                   key_end()     ファンクションキーの(1)の時点へ
                                 の復元、 CTRL+ファンクションキー
                                 のソフトキー化の解除
                   key_start()   (2)ファンクションキーの待避、 キ
                                 ー割り当ての設定、 CTRL+ファンク
                                 ションキーのソフトキー化
                   key_end()     ファンクションキーの(2)の時点へ
                                 の復元、 CTRL+ファンクションキー
                                 のソフトキー化の解除
                   key_end()     ファンクションキーの(2)の時点へ
                                 の復元、 CTRL+ファンクションキー
                                 のソフトキー化の解除

------------------------------------------------------------------------
□ key_wait - 特殊キーの入力待ち

C:      unsigned key_wait(void);

        ------------------------------------------98N 98H AT DOS-
        key_wait                                   ○  ○ * 5
        -------------------------------------------

                ● キーバッファが空ならば何か押されるまで待って、
                   そのコードを返します。

                → 入力されたキーの値 ( K_UP などの定数、または文
                   字コード )
                   特殊キーでなければ MS-DOS から入力するのと同じ
                   です。

                ○ 特殊キーの値は、グローバル変数 key_table... に
                   書かれた値から返されます。この値を変更した途端
                   にキーアサインを変更することができます。

------------------------------------------------------------------------
□ key_wait_bios - BIOSによるキー入力待ち

C:      unsigned key_wait_bios(void);

        ------------------------------------------98N 98H AT DOS-
        key_wait_bios                              ○  ○ *
        --------------------------------------------

                ● キーBIOS を用いて、キー入力があるまで待ち、 押
                   されたキーコードを返します。

                → 上位8bit  キーコード
                   下位8bit  キーデータ(キャラクタコード)

                ○ AH = 0, INT 18h を呼び出しています。

                ★ これを使うと、大抵の FEP は全く効きません。 ま
                   た、キー配列を換えている常駐ソフトが効かなかっ
                   たりします。押されたキーに対応する文字ではなく、
                   キーの位置に依存する場合にしか使わないほうが無
                   難でしょう。

------------------------------------------------------------------------
□ vkey_scan - 待たないキー入力

C:      unsigned long vkey_scan(void);

        ------------------------------------------98N 98H AT DOS-
        vkey_scan                                  ×  × ○ ○
        -------------------------------------------

                ● 現在のキーバッファを読み取り、 空(何も入力され
                   ていない)なら 0を返します。
                   何か入力されていれば、一番古いものを抜き出して
                   返します。

                → ビット割り付けは以下の通り。上位16bitは、1なら
                   押されている。
                    bit 31: SysReq
                    bit 30: CapsLock
                    bit 29: NumLock
                    bit 28: ScrollLock
                    bit 27: right Alt
                    bit 26: right Ctrl
                    bit 25: left Alt
                    bit 24: left Ctrl
                    bit 23: Ins mode
                    bit 22: CapsLock
                    bit 21: NumLock
                    bit 20: ScrollLock
                    bit 19: Alt
                    bit 18: Ctrl
                    bit 17: left shift
                    bit 16: right shift

                    bit 15-8: scan key code
                    bit  7-0: key code

                ○ キーバッファは更新されます。

                ○ 参照:  vkey_to_98(), vkey_wait()

------------------------------------------------------------------------
□ vkey_shift - シフトキー読み取り

C:      int vkey_shift(void);                              マクロ

        ------------------------------------------98N 98H AT DOS-
        vkey_shift                                 ×  × ○ ○
        -----------------------------------------------------<->-

                ● 現在のシフトキー押し下げ状態を得ます。
                   以下の値とandを取った結果が非0なら押されてるか、
                   ロックされています。

                   VK_RSHIFT VK_LSHIFT VK_SHIFT
                   VK_CTRL   VK_ALT    VK_NUMLOCK
                   VK_CAPS

------------------------------------------------------------------------
□ vkey_to_98 - 98用キーコードを得る

C:      unsigned vkey_to_98( unsigned long atkey );

        ------------------------------------------98N 98H AT DOS-
        vkey_to_98                                 ○  ○ ○ ○
        -------------------------------------------

                ● vkey_wait, vkey_scan で得た値を渡すことにより、
                   98のkey_wait, key_scan 相当の結果に変換します。

                ○ 98で実行した場合、 渡された値の下位16bitをその
                   まま返します。

                ★ 事前に get_machine()の実行が必要です。

                ○ 参照:  vkey_scan(), vkey_wait()

------------------------------------------------------------------------
□ vkey_wait - キー入力待ち

C:      unsigned long vkey_wait(void);

        ------------------------------------------98N 98H AT DOS-
        vkey_wait                                  ×  × ○ ○
        -------------------------------------------

                ● 現在のキーバッファを読み取り、 空(何も入力され
                   ていない)なら入力されるまで待ちます。
                   何か入力されれば、一番古いものを抜き出して返し
                   ます。

                → vkey_scan 参照

                ○ キーバッファは更新されます。

                ○ 参照:  vkey_scan(), vkey_to_98()


------------------------------------------------------------------------
■ 日本語FEPの制御 ■■■■■■■■■■■■■■■■■■■■■■■■■■

         日本語入力FEPのON/OFFを制御します。
         MS-KANJI APIおよび、IBM DOS/Vにおける$IAS形式に対応した
        日本語入力FEPのみが制御できます。
         最近はどの日本語入力FEPも、MS-KANJIぐらいは対応している
        ようです。

         制御する場合、あらかじめ、fep_exist を実行してください。

------------------------------------------------------------------------
□ 定数

        ● fep_existの戻り値
        表記            値      意味
        FEP_IAS         1       $IAS仕様の日本語FEPが存在
        FEP_MSKANJI     2       MS KANJI仕様の日本語FEPが存在

------------------------------------------------------------------------
□ fep_exist - 日本語FEPの存在判定

C:      int fep_exist(void);

        ------------------------------------------98N 98H AT DOS-
        fep_exist                                            ○
        -------------------------------------------

                ● FEPの存在判定を行います。

                → 0            以下のどれも存在しない
                   FEP_IAS      IBM $IAS.SYS を発見(事前に
                                get_machine()の実行が必要)
                   FEP_MSKANJI  MS KANJI APIを発見

                ★ この関数は、 他のfep_*()を呼び出す前に必ず実行
                   する必要があります。実行しないとどれも動作しま
                   せん。

------------------------------------------------------------------------
□ fep_hide - 日本語FEPの非表示

C:      void fep_hide(void);

        ------------------------------------------98N 98H AT DOS-
        fep_hide                                             ○
        -------------------------------------------

                ● 日本語FEPの日本語入力モードを解除します。

------------------------------------------------------------------------
□ fep_show - 日本語FEPの表示

C:      void fep_show(void);

        ------------------------------------------98N 98H AT DOS-
        fep_show                                             ○
        -------------------------------------------

                ● 日本語FEPを、日本語入力モードにします。

------------------------------------------------------------------------
□ fep_shown - 日本語FEPの表示状態取得

C:      int fep_shown(void);

        ------------------------------------------98N 98H AT DOS-
        fep_shown                                            ○
        -------------------------------------------

                ● FEPを検出してある場合、FEPの表示状態を得ます。

                → 1  日本語入力モード
                   0  英数入力モード(日本語FEPがOFF)


------------------------------------------------------------------------
■ マウス制御 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

         実行形式にリンクする内蔵マウスドライバ(98専用)や、 外部
        マウスドライバを呼び出す関数などです。

         内蔵マウスドライバは、 別途マウスドライバを常駐させる必
        要なく、マウスを読めるようにするものです。

        使い方の骨格を示しますと、こんな感じです。

        ・マウスカーソルあり・vsync割り込み使用時:
            初期設定
                mouse_vstart(0,7);
                mouse_cmoveto(x,y); /* 必要に応じて */
                cursor_pattern(cx,cy,bc,wc,pattern);    /* 必要に
                                                        応じて */

            カーソル表示
                cursor_show();

            読み取り
                struct mouse_info ms;
                mouse_get(&ms);
            終了
                mouse_vend();

        ・マウスカーソルあり・マウス割り込み使用時:
            「マウスカーソルあり・vsync割り込み使用時」の
            mouse_vstartを mouse_istartに、
            mouse_vendを mouse_iendにかえるだけです。

        ★ グラフィック画面を操作するときは、グラフィックカーソル
           は消さないとカーソル付近のグラフィックがおかしくなりま
           す。

        ・マウスカーソルなし・マウス割り込み使用時:
            初期設定
                mouse_proc_init();
                mouse_int_start( mouse_proc, MOUSE_120Hz );
                mouse_setmickey(8,8);   /* 必要に応じて */
                mouse_setrect(0,0,639,399); /* これも必要に応じて
                */
            読み取り
                struct mouse_info ms;
                mouse_get(&ms);
            終了
                mouse_int_end();

        ・マウスカーソルなし・割り込みを使わないとき:
            初期設定
                mouse_proc_init();
                mouse_int_start( 0, MOUSE_120Hz );
                mouse_setmickey(8,8);   /* 必要に応じて */
                mouse_setrect(0,0,639,399); /* これも必要に応じて
                */
            読み取り
                int event = mouse_proc();
                int x = mouse_X;
                int y = mouse_Y;
                int bt = mouse_Button;
                /* mouse_get()でもOK */
            終了
                mouse_int_end();

------------------------------------------------------------------------
□ 構造体/グローバル変数

struct mouse_info {
    unsigned button;                    マウスのボタンの状態
                                        (MOUSE_BL, MOUSE_BRの組み
                                        合せ)
    int x, y;                           マウスの座標
};

int mouse_X, mouse_Y                    マウスの座標
unsigned mouse_Button                   マウスのボタンの状態
unsigned mouse_ScaleX, mouse_ScaleY     感度
unsigned mouse_EventMask                イベント関数を起動するマ
                                        スク
void (far *mouse_EventRoutine)()        イベント関数のアドレス
unsigned mouse_Type                     使用している外部マウスド
                                        ライバの種類

------------------------------------------------------------------------
□ 定数

        ● mouse_int_start() の freq に指定する値
        表記            値      マウス割り込み周期
        MOUSE_120Hz     0       毎秒120回
        MOUSE_60Hz      1       毎秒60回
        MOUSE_30Hz      2       毎秒30回
        MOUSE_15Hz      3       毎秒15回

        ● mouse_proc()のイベントコード
        表記            値    イベント
        MOUSE_BL        0x01  左ボタンが押されている
        MOUSE_BR        0x02  右ボタンが押されている
        MOUSE_MOVE      0x04  マウスが動いた
        MOUSE_NOEVENT   0x08  何も起こらない
        MOUSE_BLDOWN    0x10  左ボタンが押された
        MOUSE_BLUP      0x20  左ボタンが離された
        MOUSE_BRDOWN    0x40  右ボタンが押された
        MOUSE_BRUP      0x80  右ボタンが離された
        MOUSE_EVENT     0xf4  何か起こった

        ● mousex_start()の戻り値, mouse_Type の値
        表記            値 意味
        MOUSEX_NONE     0  外部マウスドライバが存在しない
        MOUSEX_NEC      1  NEC MOUSE.SYS形式のドライバを検出
        MOUSEX_MS       2  MS MOUSE.COM形式のドライバを検出

------------------------------------------------------------------------
□ mouse_cmoveto - マウスとカーソルの移動

C:      void mouse_cmoveto( int x, int y );

        ------------------------------------------98N 98H AT DOS-
        mouse_cmoveto                              ○  × ×
        -------------------------------------------

                ● mouse_istart や mouse_vstart  を使ってグラフィ
                   ックカーソルとマウスが連動するようにしてあると
                   きに、マウスカーソルを移動します。

                ← x,y  新しい座標

------------------------------------------------------------------------
□ mouse_get - マウスの位置とボタンの読み取り

C:      void mouse_get( struct mouse_info * ms );          マクロ

        ------------------------------------------98N 98H AT DOS-
        mouse_get                                  ○  × ×
        -----------------------------------------------------<->-

                ● マウスの現在の座標とボタンの状態を得ます。

                → ms->x       x座標
                   ms->y       y座標
                   ms->button  ボタンの状態(MOUSE_BL,MOUSE_BRの組
                               み合せ)

------------------------------------------------------------------------
□ mouse_int_disable - マウス割り込みの禁止

C:      void mouse_int_disable(void);

        ------------------------------------------98N 98H AT DOS-
        mouse_int_disable                          ○  × ×
        ---------------------------------------------

                ● マウス割り込みを禁止します。
                   mouse_int_start()で、 マウス割り込みを無効にし
                   ていないときだけ効果があります。

------------------------------------------------------------------------
□ mouse_int_enable - マウス割り込みの許可

C:      void mouse_int_enable(void);

        ------------------------------------------98N 98H AT DOS-
        mouse_int_enable                           ○  × ×
        ---------------------------------------------

                ● マウス割り込みを許可します。
                   mouse_int_start()で、 マウス割り込みを無効にし
                   ていないときだけ効果があります。

------------------------------------------------------------------------
□ mouse_int_end - マウス割り込みの復帰

C:      void mouse_int_end(void);

        ------------------------------------------98N 98H AT DOS-
        mouse_int_end                              ○  × × ○
        ---------------------------------------------

                ● mouse_int_start()で設定した割り込み情報を以前
                   の値に復元します。

------------------------------------------------------------------------
□ mouse_int_start - マウス割り込みの開始

C:      void mouse_int_start( int (far pascal * mousefunc)(void), int freq );

        ------------------------------------------98N 98H AT DOS-
        mouse_int_start                            ○  × × ○
        ---------------------------------------------

                ● マウス割り込みの初期設定をします。
                   マウスを操作する場合、割り込みを使わなくても、
                   すでに常駐しているマウスドライバを眠らせるため
                   にこの初期設定が必要です。

                ← mousefunc     0 ならばマウス割り込み無効。
                                 0以外なら、マウス割り込み処理の
                                アドレスを指定します。
                                通常は、 mouse_procを指定してくだ
                                さい。
                   freq         以下の定数から指定します。
                                MOUSE_120Hz
                                MOUSE_60Hz
                                MOUSE_30Hz
                                MOUSE_15Hz

                ★ mouse_int_start()を実行したら、 終了前には必ず
                   mouse_int_end()を実行する必要があります。 実行
                   しなければ、プログラム終了後暴走するでしょう。

------------------------------------------------------------------------
□ mouse_proc - マウス管理ルーチン

C:      int mouse_proc(void);

        ------------------------------------------98N 98H AT DOS-
        mouse_proc                                 ○  × ×
        ---------------------------------------------

                ● マウスのハードウェアから、位置とボタン情報を読
                   み取りイベントを判定し、必要に応じて
                   mouse_EventRoutineに書かれたアドレスのイベント
                   処理ルーチンをFAR CALLします。
                    イベント処理ルーチンを呼び出す要因は、
                   mouse_EventMaskグローバル変数と、 以下のイベン
                   トの論理積(AND)を取った結果が 0 でなければ、と
                   いうことになります。
                    イベント処理ルーチンを呼び出す際、AXレジスタ
                   にイベント値、DXレジスタにx座標、BXレジスタにy
                   座標が入ります。SIレジスタ以外は自由に破壊して
                   かまいません。SIにはこの関数(mouse_proc)の戻り
                   値が入っています。イベント処理ルーチンから帰っ
                   てきたら mouse_proc は  SIに入っている値を戻り
                   値として終了します。
                    mouse_proc の戻り値は、 デフォルトでイベント
                   値が格納されています。

                → 発生したイベント
                        以下のビットの組み合せになります。
                        MOUSE_BLDOWN    左ボタンが押された
                        MOUSE_BLUP      左ボタンが離された
                        MOUSE_BRDOWN    右ボタンが押された
                        MOUSE_BRUP      右ボタンが離された
                        MOUSE_MOVE      マウスが動いた
                        MOUSE_NOEVENT   上記のどれも発生しなかっ
                                        た
                        MOUSE_BL        左ボタンの状態(0=離されて
                                        いる)
                        MOUSE_BR        右ボタンの状態(0=離されて
                                        いる)

------------------------------------------------------------------------
□ mouse_proc_init - マウス管理の初期化

C:      void mouse_proc_init(void);

        ------------------------------------------98N 98H AT DOS-
        mouse_proc_init                            ○  × ×
        ---------------------------------------------

                ● マウス座標管理データを初期化します。
                   移動範囲は画面全体、カーソル位置は画面中心、ミ
                   ッキー/ドット比は、  横方向は   8、  縦方向は
                   400line時は8,  200line時は16が設定されます。こ
                   のため、 200lineで用いるときは、  画面の設定は
                   graph_200line()を用いてください。

------------------------------------------------------------------------
□ mouse_resetrect - マウス管理矩形の初期化

C:      void mouse_resetrect(void);

        ------------------------------------------98N 98H AT DOS-
        mouse_resetrect                            ○  × ×
        ---------------------------------------------

                ● マウスの移動範囲を画面全体にします。

------------------------------------------------------------------------
□ mouse_setmickey - マウスの移動速度を指定する

C:      void mouse_setmickey( unsigned mx, unsigned my );

        ------------------------------------------98N 98H AT DOS-
        mouse_setmickey                            ○  × ×
        -------------------------------------------

                ● マウスの移動速度を指定します。
                   x,y それぞれについて、マウス論理座標が  8進む
                   のに必要なカウント数を指定します。値が大きいほ
                   ど遅くなります。

                ★ mxまたは myに  0を指定するとゼロ除算エラーが発
                   生します。

------------------------------------------------------------------------
□ mouse_setrect - マウス管理矩形の設定

C:      void mouse_setrect( int x1, int y1, int x2, int y2 );

        ------------------------------------------98N 98H AT DOS-
        mouse_setrect                              ○  × ×
        ---------------------------------------------

                ● マウスの移動範囲を指定します。
                   それぞれ x1 ≦ x2, y1 ≦  y2でなければなりませ
                   ん。
                   すでにマウスが範囲外なら、一番近い境界線上に移
                   動します。

------------------------------------------------------------------------
□ mouse_vend - VSYNC割り込みマウス終了

C:      void mouse_vend(void);

        ------------------------------------------98N 98H AT DOS-
        mouse_vend                                 ○  × × ○
        ---------------------------------------------

                ● mouse_vstart で開始したマウス処理を終了します。

                ★ 内部で cursor_hide,  vsync_end,  mouse_int_end
                   を呼んでいます。

------------------------------------------------------------------------
□ mouse_vstart - VSYNC割り込みマウス設定

C:      void mouse_vstart( int blc, int whc );

        ------------------------------------------98N 98H AT DOS-
        mouse_vstart                               ○  × × ○
        ---------------------------------------------

                ● VSYNC割り込みを使用して、 グラフィックカーソル
                   をマウスに連動させるように設定します。グラフィ
                   ックカーソルは cursor_Arrow を使用し、表示状態
                   は cursor_show()一回で表示開始するように設定し
                   ます。

                ← blc   黒い部分の色(0~15)
                   whc   白い部分の色(0~15)

                ○ 各種制御には以下の関数を使用してください。
                  カーソル形状:
                cursor_pattern/cursor_pattern2/cursor_setpattern
                  移動範囲:     mouse_setrect
                  感度:         mouse_setmickey
                  カーソル表示: cursor_show/cursor_hide
                  カーソル位置: mouse_cmoveto

                ★ 事前に mouse_int_start 等を呼んではいけません。
                ★ この関数を実行したら、終了時に必ず  mouse_vend
                   を実行してください。
                ★ 内部で vsync_start, vsync_proc_set  を使用して
                   います。  従って動作中に   vsync_proc_set   や
                   vsync_endを呼び出すと動作が止まってしまいます。

------------------------------------------------------------------------
□ mouse_iend - マウス割り込みマウス終了

C:      void mouse_iend(void);

        ------------------------------------------98N 98H AT DOS-
        mouse_iend                                 ○  × × ○
        ---------------------------------------------

                ● mouse_istart で開始したマウス処理を終了します。

                ★ 内部で cursor_hide, mouse_int_end を呼んでいま
                   す。

------------------------------------------------------------------------
□ mouse_istart - マウス割り込みマウス設定

C:      void mouse_istart( int blc, int whc );

        ------------------------------------------98N 98H AT DOS-
        mouse_istart                               ○  × × ○
        ---------------------------------------------

                ● マウス割り込み(120Hz)を使用して、 グラフィック
                   カーソルをマウスに連動させるように設定します。
                   グラフィックカーソルは cursor_Arrow を使用し、
                   表示状態は cursor_show()一回で表示開始するよう
                   に設定します。

                ← blc   黒い部分の色(0~15)
                   whc   白い部分の色(0~15)

                ○ 各種制御には以下の関数を使用してください。
                  カーソル形状:
                cursor_pattern/cursor_pattern2/cursor_setpattern
                  移動範囲:     mouse_setrect
                  感度:         mouse_setmickey
                  カーソル表示: cursor_show/cursor_hide
                  カーソル位置: mouse_cmoveto

                ★ 事前に mouse_int_start 等を呼んではいけません。
                ★ この関数を実行したら、終了時に必ず  mouse_iend
                   を実行してください。

------------------------------------------------------------------------
□ mousex_end - 外部マウスドライバ使用終了

C:      void mousex_end(void);

        ------------------------------------------98N 98H AT DOS-
        mousex_end                                           ○
        ---------------------------------------------

                ● mousex_startで認識した外部マウスドライバを初期
                   化することで、使用を終了します。

------------------------------------------------------------------------
□ mousex_iend - 外部優先マウスの使用終了(簡単)

C:      void mousex_iend(void);

        ------------------------------------------98N 98H AT DOS-
        mousex_iend                                ○  × × ○
        --------------------------------------------

                ● mousex_istart で開始したマウス処理を終了します。

                ★ 内部で cursor_hide, mouse_int_end,  mousex_end
                   を呼んでいます。

------------------------------------------------------------------------
□ mousex_istart - 外部優先マウスの使用開始(簡単)

C:      void mousex_istart( int blc, int whc );

        ------------------------------------------98N 98H AT DOS-
        mousex_istart                              ○  × × ○
        --------------------------------------------

                ● 外部マウスドライバがあればそれを使用し、なけれ
                   ばマウス割り込み(120Hz)を使用して、 グラフィッ
                   クカーソルをマウスに連動させるように設定します。
                    グラフィックカーソルは cursor_Arrow を使用し、
                   表示状態は cursor_show()一回で表示開始するよう
                   に設定します。

                ← blc   黒い部分の色(0~15)
                   whc   白い部分の色(0~15)

                △ 各種制御には以下の関数を使用してください。
                  カーソル形状:
                cursor_pattern/cursor_pattern2/cursor_setpattern
                  移動範囲:     mousex_setrect
                  感度:         mouse_setmickey
                  カーソル表示: cursor_show/cursor_hide
                  カーソル位置: mouse_cmoveto

                ★ 事前に mouse_int_start 等を呼んではいけません。
                ★ この関数を実行したら、終了時に必ず mousex_iend
                   を実行してください。
                ★ マウスドライバが存在しなければ、
                   cursor_initとcursor_setpattern(cursor_Arrow)が
                   実行されるだけでドライバは組み込まれません。判
                   別は、mouse_Type 変数をみて、MOUSEX_NONEでかつ
                   機種がAT系ならば組込み失敗として処理してくださ
                   い。

------------------------------------------------------------------------
□ mousex_moveto - 外部マウスドライバカーソル位置設定

C:      void mousex_moveto( int x, int y );

        ------------------------------------------98N 98H AT DOS-
        mousex_moveto                                        ○
        ---------------------------------------------

                ● mousex_startで認識したマウス座標を変更します。

                ← x,y 新しいマウス座標

------------------------------------------------------------------------
□ mousex_setrect - 外部マウスドライバ移動範囲設定

C:      void mousex_setrect( int x1, int y1, int x2, int y2 );

        ------------------------------------------98N 98H AT DOS-
        mousex_setrect                                       ○
        ---------------------------------------------

                ● mousex_startで認識したマウスの座標範囲を指定し
                   ます。

                ← x1,y1  左上座標
                   x2,y2  右下座標

------------------------------------------------------------------------
□ mousex_start - 外部マウスドライバ使用開始

C:      int mousex_start(void);

        ------------------------------------------98N 98H AT DOS-
        mousex_start                                         ○
        ---------------------------------------------

                ● 外部マウスドライバの存在を検査し、使用を開始し
                   ます。
                   この初期化をすると、マウス割り込みによってグロ
                   ーバル変数 mouse_X,mouse_Y,mouse_Button に現在
                   のマウスカーソルの位置とボタンの状態が常に設定
                   されます。
                   また、マウスイベント割り込み (mouse_EventMask,
                   mouse_EventRoutine)も使用できます。(ただし
                   MOUSE_NOEVENT, MOUSE_BL, MOUSE_BR は使えません)

                → MOUSEX_NONE  外部マウスドライバが存在しないの
                                で、失敗
                   MOUSEX_NEC   NEC MOUSE.SYS形式のドライバを検出
                   MOUSEX_MS    MS MOUSE.COM形式のドライバを検出

                   この結果は、mouse_Type にも格納されます。

                ★ 事前に mouse_int_start 等を呼んではいけません。
                ★ この関数を実行したら、終了時にかならず
                   mousex_end を実行してください。
                ★ この関数は低レベルなぶん繁雑なので、これを呼び
                   出す簡単な mousex_istart 系もあります。


------------------------------------------------------------------------
■ ジョイスティック読み取り ■■■■■■■■■■■■■■■■■■■■■■

        ジョイスティックまたはキーボードによってリアルタイムに操
        作するための処理です。

        ●98の場合:
          以下の端子に接続されたジョイスティックに対応しています。
          ・サウンドボード(PC-9801-26/K)やこの互換ジョイスティッ
            クボード
               ポートアドレスは既定値のみ
          ・システムサコム製ジョイスティックボードSAJ-98
               ポートアドレスは 0e3e0h,0e5e0h,0e7e0h に対応
               複数存在した場合、最も小さいアドレスを使用します。
               サウンドボードと両方存在した場合、アナログモードで
               は SAJ-98 しかチェックしません。
          ・キーボードコネクタに接続し、 テンキーをエミュレーショ
            ンするもの

        ●PC/ATの場合:
          ・game portに接続されたジョイスティックに対応します。

          ・キャリブレーションは、付属の calib.exeを使うか、 その
            ソース calib.cを元にプログラムに組み込んでください。

        ●使用方法
        ・開始
        js_start(JS_NORMAL);

        ・メインループ
        esc = js_sense();       /* 読み取り */
        if ( esc ) {
            /* escキー処理 */
        }
        /* 時間のかかる処理 ( 描画や vsync_waitなど ) */
        /* ( js_analog()も時間かかります(^^; ) */
        ...
        js_sense2();            /* キーボード読み取り */
        if ( js_stat[0] & JS_UP ) {
            /* 上へ… */
        }

        ・キーアサイン
        キーボードで操作する場合、 キーの割り当ては次のようになっ
        ています。
        []で囲ってあるキーは、js_keyassignなどで変更可能です。

          player1
            スティック
               カーソルキー   テンキー   フルキー
                   ↑         7  8  9       K
                 ←  →       4     6    H     L
                   ↓         1  2  3       J

            ボタン1  ボタン2  ボタン3  ボタン4
             space    return   [shift]    [Q]

            (js_key2player(0) 実行時,デフォルト)
            ボタン1  ボタン2
              [Z]      [X]

            (js_key2player(1) 実行時)
            ボタン1  ボタン2
              [0]      [5]     (テンキー)

          player2
            スティック
                 [E]
              [S]   [F]
                 [C]

            ボタン1  ボタン2  ボタン3  ボタン4
             [GRPH]    [D]      なし     なし

------------------------------------------------------------------------
□ 構造体/グローバル変数

int js_bexist;          1=サウンドボード認識 0=無視(不在)
int js_shift;           1=全ジョイスティックはplayer2専用
int js_2player;         1=キーボードもplayer2処理を行う
unsigned js_stat[2];    ジョイスティックの状態(1P,2P)
unsigned js_saj_port;   <98> SAJ-98のポートアドレス。0なら不在

struct AT_JS_CALIBDATA {        キャリブレート情報
        char id[AT_JS_RESIDLEN];
        char filler[16-(AT_JS_RESIDLEN&15)];
        Point dmin, dmax, dcenter;      at_js_fast=1の時の値
        Point amin, amax, acenter;      at_js_fast=0の時の値
} ;

at_js_mintime           ジョイスティックの値の下限(設定)  (初
                        期値30)
at_js_maxtime           ジョイスティックの値の上限(設定)  (初
                        期値1700)
at_js_count             ジョイスティックの一定時間分のループ
                        回数(計測)
at_js_x1,at_js_y1       ジョイスティック1のx,yカウント値(計測)
at_js_x2,at_js_y2       ジョイスティック2のx,yカウント値(計測)
                        上記は、 at_js_min~at_js_maxの間を全体と
                        して計算してください。
at_js_min               ジョイスティックの値の下限カウント(算
                        出)
at_js_max               ジョイスティックの値の上限カウント(算
                        出)

        上記、設定可能なのは、(設定)とかかれたもののみです。 しか
        も設定しても at_js_startを実行するまで反映されません。

at_js_fast              1=RTC割り込みによるバックグラウンド読
                        み取り
                            0=直接読み取り(at_js_start)
at_js_resseg            キャリブレーション常駐データのセグメ
                        ントアドレス。
                            master.h参照(^^;

------------------------------------------------------------------------
□ 定数

        ● js_start()の初期化用定数
        表記            値      意味
        JS_NORMAL       0       通常
        JS_FORCE_USE    1       サウンドボードがあることにする
        JS_IGNORE       2       サウンドボードを無視する

        ● デジタルジョイスティックおよびキーボードの状態
        表記            値      意味
        JS_UP           0x01    上が押されている
        JS_DOWN         0x02    下が押されている
        JS_LEFT         0x04    左が押されている
        JS_RIGHT        0x08    右が押されている
        JS_TRIG1        0x10    ボタン1が押されている
        JS_TRIG2        0x20    ボタン2が押されている
        JS_TRIG3        0x40    ボタン3が押されている
        JS_TRIG4        0x80    ボタン4が押されている

        ● <98>アナログジョイスティック(js_analog()の  astat[3]に
           格納)
        表記            値      意味
        JSA_A           0x80    Aボタンが押されている
        JSA_B           0x40    Bボタンが押されている
        JSA_C           0x20    Cボタンが押されている
        JSA_D           0x10    Dボタンが押されている
        JSA_E1          0x08    E1ボタンが押されている
        JSA_E2          0x04    E2ボタンが押されている
        JSA_START       0x02    STARTボタンが押されている
        JSA_SELECT      0x01    SELECTボタンが押されている

        ● キー割り当て指示対象(js_keyassign())
        表記            意味
        JS_1P1          <98>player1 ボタン1
        JS_1P2          <98>player1 ボタン2
        JS_1P3          <98>player1 ボタン3
        JS_1P4          <98>player1 ボタン4

        JS_2P1          <98>player2 ボタン1
        JS_2P2          <98>player2 ボタン2
        JS_2PRIGHT      <98>player2 →
        JS_2PLEFT       <98>player2 ←
        JS_2PDOWN       <98>player2 ↓
        JS_2PUP         <98>player2 ↑

        AT_JS_1P1       player1 ボタン1
        AT_JS_1P2       player1 ボタン2
        AT_JS_1P3       player1 ボタン3
        AT_JS_1P4       player1 ボタン4

        AT_JS_2P1       player2 ボタン1
        AT_JS_2P2       player2 ボタン2
        AT_JS_2PRIGHT   player2 →
        AT_JS_2PLEFT    player2 ←
        AT_JS_2PDOWN    player2 ↓
        AT_JS_2PUP      player2 ↑

        ● キャリブレート関係定数
        表記               意味
        AT_JS_RESID[]      キャリブレート情報のメモリブロック
                           名
        AT_JS_RESIDLEN     AT_JS_RESIDの長さ
        AT_JS_RESPARASIZE  キャリブレート情報メモリブロックの
                           パラグラフサイズ

------------------------------------------------------------------------
□ at_js_calibrate - ジョイスティックのキャリブレート

C:      void at_js_calibrate( const Point far * min, const  Point
                             far * max, const Point far * center);

        ------------------------------------------98N 98H AT DOS-
        at_js_calibrate                            ×  × ○
        --------------------------------------------

                ● スティックを左上に倒した時、右下に倒したとき、
                   真ん中に戻したときのそれぞれのstickのx,y値を指
                   定することで、 at_js_senseにおいてデジタル判定
                   できるようにします。
------------------------------------------------------------------------
□ at_js_get_calibrate - 常駐キャリブレート情報取得

C:      unsigned at_js_get_calibrate(void);                マクロ

        ------------------------------------------98N 98H AT DOS-
        at_js_get_calibrate                        ×  × ○
        -----------------------------------------------------<->-

                ● calib.exe を使って常駐させたキャリブレート情報
                   を検索します。

                → 0       見つからない
                   0以外   見つかったセグメントアドレス。
                          at_js_ressegにも同じ値が格納される。

                例: at_js_resptr参照

------------------------------------------------------------------------
□ at_js_resptr - 常駐キャリブレート構造体を得る

C:      struct AT_JS_CALIBDATA far * at_js_resptr;         マクロ

        ------------------------------------------98N 98H AT DOS-
        at_js_resptr                               ×  × ○
        -----------------------------------------------------<->-

                ● at_js_get_calibrate()によって検索されたセグメ
                   ント(at_js_resseg変数)の、offset 0から
                   AT_JS_CALIBDATA構造体があるとみなして、 ポイン
                   タを作成します。

                ★ 必ず  at_js_get_calibrate()の結果が非0である状
                   態でのみ使ってください。

                例:  キャリブレート結果を反映させたジョイスティッ
                クの初期化例

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
  at_js_start(JS_NORMAL);
  if ( at_js_get_calibrate() ) {
    at_js_calibrate(&at_js_resptr->dmin,
                    &at_js_resptr->dmax,
                    &at_js_resptr->dcenter);
  }
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

------------------------------------------------------------------------
□ at_js_wait - ジョイスティックのボタン待ち

C:      int at_js_wait(Point *p);

        ------------------------------------------98N 98H AT DOS-
        at_js_wait                                 ×  × ○
        --------------------------------------------

                ● ジョイスティックのボタンを押すまで待ち、 stick
                   のx,y値をpに格納します。これはキャリブレートさ
                   れていなくても読み取られます。

                ○ この関数は、キャリブレート画面の作成のために用
                   意しました。

------------------------------------------------------------------------
□ js_analog - アナログジョイスティック読み取り

C:      int js_analog( int player, unsigned char astat[4] );

        ------------------------------------------98N 98H AT DOS-
        js_analog                                  ○     ×
        -------------------------------------------

                ● アナログジョイスティックの状態を読み取り、
                   astat[]に格納します。
                   SAJ-98とサウンドボードが両方存在する場合、
                   SAJ-98側しか検査しません。

                ← player   1 = 1P  2 = 2P
                   astat[]  格納先。
                       astat[0]  ch0の値。 0=上, 0ffh=下
                       astat[1]  ch1の値。 0=左, 0ffh=右
                       astat[2]  ch2の値。 0=上, 0ffh=下
                       astat[3]  ボタンの値。押されているとそれぞ
                                 れのビットが立つ。
                                JSA_A JSA_B  JSA_C  JSA_D  JSA_E1
                                JSA_E2 JSA_START JSA_SELECT

                → 1  読み取り成功。astatに格納した。
                   0  読み取り失敗(アナログモードジョイスティック
                      が接続されていないなど) astatは変化しません。

                ★ 前もって js_startの実行が必要です。

                ★ この関数が 1 を返したときは、 接続されているジ
                   ョイスティックがアナログモードになっているので、
                   js_senseによってジョイスティックの状態を得るこ
                   とはできなくなります。

                ★ 念のため、存在確認は数回行い、存在が確認できた
                   ら実行時はエラーを無視するようにすると無難です。

                ★ 80hがセンター(中央)ですが、 前後にある程度遊び
                   をつくっておかないと、手を離していても動いてし
                   まったりします。78h~88hならどれも中央とするぐ
                   らいにはすべきです。
------------------------------------------------------------------------
□ js_end, at_js_end - ジョイスティック読み取り終了

C:      void js_end(void);
C:      void at_js_end(void);

        ------------------------------------------98N 98H AT DOS-
        js_end                                     ○     *
        ----------------------------------------------
        at_js_end                                  ×  × ○
        --------------------------------------------

                ● js_start,  at_js_startで行ったリアルタイムキー
                   読み取り処理を解除します。また、キーバッファを
                   クリアします。
                ★ この関数で割り込みを解除するため、必ず実行
                   してください。

------------------------------------------------------------------------
□ js_key - (キー割り当て変更・内部関数)

C:      void js_key( unsigned func, int group, int maskbit );

        ------------------------------------------98N 98H AT DOS-
        js_key
        ----------------------------------------------

                ● キー判定を行うコードを書き換えます。

                ← func     master.libコードセグメント内の書き換
                            えコードのオフセットアドレス
                   group    検査を行うバイトのオフセットアドレス
                   maskbit  ビットテストする値

                ・書き換え対象のコードは、 以下のようになっている
                  必要があります。

                  LABEL:  mov  AL,ES:[アドレス]
                          test AL,ビットテストする値

                ★ この関数は直接使わないでください。将来変更され
                   る可能性があります。

------------------------------------------------------------------------
□ js_key2player, at_js_key2player - キーボードでの二人操作設定

C:      void js_key2player( int flag );                    マクロ
C:      void at_js_key2player( int flag );                 マクロ

        ------------------------------------------98N 98H AT DOS-
        js_key2player                              ○  × *
        at_js_key2player                           ×  × ○
        ------------------------------------------------------<>-

                ● キーボードでの二人操作の有無を指定します。

                ← flag   1  キーボードで2人操作を行う
                          0  キーボードは1人専用

                ○ なお、この処理を実行すると、 player1のボタン1,
                   ボタン2のキーアサインを以下のように強制設定し
                   ます。

                    flag  ボタン1  ボタン2   備考
                     0       Z        X      デフォルト
                     1       0        5      テンキーのみ

                ○ js_2player 変数に、 flagの値をそのまま設定しま
                   す。

------------------------------------------------------------------------
□ js_keyassign - キー割当変更

C:      void js_keyassign( unsigned func, int group, int  maskbit
                          );                               マクロ

        ------------------------------------------98N 98H AT DOS-
        js_keyassign                               ○  × ○
        -----------------------------------------------------<->-

                ● キー割り当てを変更します。

                ← func     変更対象の操作
                      <98>        
                      JS_1P1      AT_JS_1P1     player1 ボタン1
                      JS_1P2      AT_JS_1P2     player1 ボタン2
                      JS_1P3      AT_JS_1P3     player1 ボタン3
                      JS_1P4      AT_JS_1P4     player1 ボタン4

                      JS_2P1      AT_JS_2P1     player2 ボタン1
                      JS_2P2      AT_JS_2P2     player2 ボタン2
                      JS_2PRIGHT  AT_JS_2PRIGHT player2 →
                      JS_2PLEFT   AT_JS_2PLEFT  player2 ←
                      JS_2PDOWN   AT_JS_2PDOWN  player2 ↓
                      JS_2PUP     AT_JS_2PUP    player2 ↑

                   group    検査するキーグループ
                   maskbit  検査するビット 0x01~0x80

                ○ キーグループなどは、…調べてください(ぐえ)
                ★ 98とATでは、group, maskbitの値が異なります。注
                   意してください。場合によっては、以下のように場
                   合分けしてください。
                #if MASTER98
                 js_keyassign(JS_1P1,9,0x40);
                #endif
                #if MASTERV
                 js_keyassign(AT_JS_1P1,10,0x04);
                #endif

------------------------------------------------------------------------
□ js_sense, at_js_sense - 現在のジョイスティック状態の取得

C:      int js_sense(void);
C:      int at_js_sense(void);

        ------------------------------------------98N 98H AT DOS-
        js_sense                                   ○     *
        -------------------------------------------
        at_js_sense                                ×  × ○
        --------------------------------------------

                ● デジタルジョイスティックおよびキーボードの状態
                   を js_stat[]に格納します。

                → ESCキーの状態
                     0以外 押されている
                     0     押されていない

                ○ また、js_stat[0]に以下のビットの組み合わせが設
                   定されます。
                   JS_UP        上が押されている
                   JS_DOWN      下が押されている
                   JS_LEFT      左が押されている
                   JS_RIGHT     右が押されている
                   JS_TRIG1     Aボタンが押されている
                   JS_TRIG2     Bボタンが押されている
                   JS_IRST1     (SHIFTキー)が押されている
                   JS_IRST2     (Qキー)が押されている

                ★ at_js_calibrate によりキャリブレートされて
                   いなければジョイスティックは読み取りません。

------------------------------------------------------------------------
□ js_sense_nokey, at_js_sense_nokey -  現在のジョイスティック状態の取得
   (キーなし)

C:      int js_sense_nokey(void);
C:      int at_js_sense_nokey(void);

        ------------------------------------------98N 98H AT DOS-
        js_sense_nokey                             ○     *
        -------------------------------------------
        at_js_sense_nokey                          ×  × ○
        --------------------------------------------

                ● デジタルジョイスティックの状態を js_stat[]に格
                   納します。キーの状態は、ESCだけ取得します。

                → ESCキーの状態
                     0以外 押されている
                     0     押されていない

                ○ また、js_stat[0]に以下のビットの組み合わせが設
                   定されます。
                   JS_UP        上が押されている
                   JS_DOWN      下が押されている
                   JS_LEFT      左が押されている
                   JS_RIGHT     右が押されている
                   JS_TRIG1     Aボタンが押されている
                   JS_TRIG2     Bボタンが押されている

                ★ at_js_calibrate によりキャリブレートされて
                   いなければジョイスティックは読み取りません。

------------------------------------------------------------------------
□ js_sense2 - ジョイスティック読み取り補助

C:      int js_sense2(void);

        ------------------------------------------98N 98H AT DOS-
        js_sense2                                  ○     *
        -------------------------------------------

                ● キーボードの状態によって js_stat[]を修正します。
                   js_sense()から 1~数十ms遅らせてこの関数を実行
                   することによってキーボードリピートを無視するこ
                   とができます。

                → ESCキーの状態
                     0以外 押されている
                     0     押されていない

------------------------------------------------------------------------
□ js_start, at_js_start - ジョイスティック読み取り開始

C:      int js_start( int force );
C:      int at_js_start( int force );

        ------------------------------------------98N 98H AT DOS-
        js_start                                   ○     *
        --------------------------------------------
        at_js_start                                ×  × ○
        --------------------------------------------

                ● <98>ジョイスティック関連の変数を初期設定します。
                ● キーボードハードウェア割り込みをフックして、
                   リアルタイムスキャンを可能にします。at_js_fast
                   変数が1であれば、 joystickを高速に読み取るため
                   にRTC割り込みもフックします。

                ← force
                     JS_NORMAL     通常(Joy Stick 存在検査する)
                     JS_FORCE_USE  <98>サウンドボードがあることに
                                   する(ないのに使うと暴走するか
                                   も)
                                   Joy  Stickの存在を検査しな
                                   い
                     JS_IGNORE     <98>サウンドボードを無視する
                                   (SAJ-98だけ使いたいとか)
                                   Joy  Stickの存在を検査しな
                                   い

                → 0  キーボードのみ
                   1  <98>サウンドボードを認識した
                      ジョイスティックを認識した
                   2  <98>SAJ-98を認識した

                ★ <98>SAJ-98が存在する場合、常にSAJ-98だけを認識
                   します。

                ○ 動作環境の速度にもとづいて at_js_count  を
                   設定します。
                ○ at_js_mintime,at_js_maxtimeにもとづいて
                   at_js_min,at_js_maxを設定します。
                ○ キーボード割り込み(INT  09h),  RTC割り込み
                   (INT 70h)を使用しています。

                ★ 終了時は必ず at_js_end を実行してください。
                   そうしないと暴走します。
                ★ at_js_fast変数が1 だと、DOS  BOX内では動作
                   しません。


------------------------------------------------------------------------
■ テキスト画面 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■


------------------------------------------------------------------------
■ PC/AT 画面モード制御 ■■■■■■■■■■■■■■■■■■■■■■■■

        PC/AT には、ビデオモードが多数存在します。 目的に応じて切
        り替える必要があるため、基本的な制御関数を用意しました。

------------------------------------------------------------------------
□ 構造体/グローバル変数

        ● VIDEO_STATE構造体
           (backup_video_state,restore_video_state)
typedef struct VIDEO_STATE VIDEO_STATE ;
struct VIDEO_STATE {
        unsigned mode;          現在のビデオ・モード
        unsigned rows;          現在の1画面の行数
        unsigned cols;          現在の1行あたりの桁数
        unsigned total_rows;    現在の画面全体の行数
};

------------------------------------------------------------------------
□ backup_video_state - 復元を前提としたビデオモード取得

C:      void backup_video_state( VIDEO_STATE * vmode );

        ------------------------------------------98N 98H AT DOS-
        backup_video_state                         ×  × ○
        -------------------------------------------

                ● 現在のビデオモード、画面桁数、行数、フォントの
                   大きさを VIDEO_STATE構造体に格納します。

                ★ get_machineを事前に実行する必要があります。

------------------------------------------------------------------------
□ get_video_mode - ビデオモードの取得

C:      unsigned get_video_mode(void);

        ------------------------------------------98N 98H AT DOS-
        get_video_mode                             ×  × ○
        -------------------------------------------

                ● 現在のビデオモードを取得します

                → 現在のビデオモード値

                ○ 現在DOSが英語モードである場合は、最初にVESA
                   video   biosによって取得し、  失敗したら通常の
                   video biosで取得します。
                ○ 日本語モードである場合は、通常の video  biosで
                   のみ取得します。

                ★ get_machineを事前に実行する必要があります。

------------------------------------------------------------------------
□ restore_video_state - ビデオモードの復元

C:      int restore_video_state( const VIDEO_STATE * vmode );

        ------------------------------------------98N 98H AT DOS-
        restore_video_state                        ×  × ○
        -------------------------------------------

                ● ビデオモード、 VIDEO_STATE構造体の内容で再設定
                   します。

                ★ get_machineを事前に実行する必要があります。

------------------------------------------------------------------------
□ set_video_mode - ビデオモードの設定

C:      int set_video_mode( unsigned video );

        ------------------------------------------98N 98H AT DOS-
        set_video_mode                             ×  × ○
        -------------------------------------------

                ● ビデオモードを設定します。現在は各種グローバル
                   変数には手を付けません。

                ← video  ビデオモード値

                → 1   成功
                   0   失敗

                ○ ビデオモード値が 100h以上である場合、VESA
                   video bios function を用いて設定します。

                ★ get_machineを事前に実行する必要があります。


------------------------------------------------------------------------
■ テキスト画面操作 ■■■■■■■■■■■■■■■■■■■■■■■■■■

        テキスト画面関連の操作をします。
        <98>ハイレゾモードでも動作するプログラムを作成する場合は、
        必ず text_start() を最初に呼び出してください。

        あらかじめテキストモードにするか、 16色グラフィックモ
        ードで  vtextx_start を実行する必要が有ります。そうしない
        と表示されません。
        DOS/Vでは、 3バイト属性モードには対応していないので、
        注意してください。 また、文字属性は、98での文字属性と異な
        ります。98での属性のイメージで処理したい場合は、 変換関数
        vtext_color_98()を利用してください。

        ここで説明する関数は、事前に get_machine()と
        vtext_start()が実行されてなければ正常に動作しないものが数
        多くあります。

------------------------------------------------------------------------
□ 構造体/グローバル変数

unsigned TextVramSeg;    テキスト画面の先頭セグメントアドレス。
                        初期値は0xA000 になっています。
                        <98>この値を変更することによりハイレゾや、
                        2ページ目をアクセスすることができます。
                        また、仮想VRAMを使うこともできます。(属性
                        の開始アドレスはoffset  2000hからに固定な
                        ので注意してください)

void far * TextVramAdr;  テキスト画面の VRAM の先頭アドレス。 セ
                        グメント部分は  TextVramSeg の別名(エイリ
                        アス)になっていますので、変更すると両方が
                        変更されることになります。 オフセット部分
                        は、初期値 0 になっています。ただし text_
                        で始まる関数はこのオフセット値を見ていま
                        せんので、変更するのではなく、far  ポイン
                        タとして参照するときに利用することになり
                        ます。

int TextShown ;          テキスト画面の表示状態を保持します。 初
                        期値は 1 で、「表示」です。非表示にすると
                        0を格納します。

unsigned VTextState;    bit15:  1=グラフィックモード
                                0=テキストモード
                        bit14:  1=テキストグラフィックモード
                                (vtextx_startが実行された状態)
                        bit0:   1=書き込み時更新しない
                                0=書き込み時更新する
unsigned TextVramWidth; 現在のテキスト画面の桁数(vtext_start())
                        初期値=80
unsigned TextVramSize;  テキスト画面全体の文字数(vtext_start())
                        初期値=4000

char vtext_colortable[16];      vtextx:  16色のカラーコードからグ
                                         ラフィックの色に変換する
                                         テーブル。vtextx_start参
                                         照


------------------------------------------------------------------------
□ 定数

        ● 98テキスト属性定数
        表記            値      意味
        TX_BLACK        0x01    黒
        TX_BLUE         0x21    青
        TX_RED          0x41    赤
        TX_MAGENTA      0x61    マゼンタ
        TX_GREEN        0x81    緑
        TX_CYAN         0xa1    シアン
        TX_YELLOW       0xc1    黄色
        TX_WHITE        0xe1    白

        TX_BLINK        2       点滅
        TX_REVERSE      4       反転
        TX_UNDERLINE    8       下線

        ● <98>テキスト画面セグメント定数
        表記            値      意味
        TX_PAGE0        0xa000  ノーマルモード先頭頁
        TX_PAGE1        0xa100  ノーマルモード第2頁

------------------------------------------------------------------------
□ text_20line - 20行モードにする

C:      void text_20line(void);

        ------------------------------------------98N 98H AT DOS-
        text_20line                                ○  × ×
        ----------------------------------------------

                ● テキスト画面を 20行表示モードにします。(通常時)
                   30行BIOS 常駐時は、行間あきモードになります。
                   ハイレゾモードでは使えません。

                ★ int 29h(高速コンソール出力)を使用しています。

------------------------------------------------------------------------
□ text_25line - 25行モードにする

C:      void text_25line(void);

        ------------------------------------------98N 98H AT DOS-
        text_25line                                ○  ○ ×
        ----------------------------------------------

                ● テキスト画面を 25行表示モードにします。(通常時)
                   30行BIOS 常駐時は、行間なしモードになります。

                ★ int 29h(高速コンソール出力)に、ESCシーケンスを
                   出力することで実現しています。

------------------------------------------------------------------------
□ text_accesspage - テキスト画面のアクセスページを設定する

C:      void text_accesspage( int page);                   マクロ

        ------------------------------------------98N 98H AT DOS-
        text_accesspage                            ○  × ×
        -----------------------------------------------------<->-

                ● TextVramSegの値を変更することにより、 アクセス
                   ページを設定します。

                ← page  0(通常)または1(裏)

                ★ master.libの text_* および gaiji_*  関数にのみ
                   効果があります。

------------------------------------------------------------------------
□ text_backup, vtext_backup - テキスト画面の保存

C:      int text_backup( int use_main );
C:      int vtext_backup( int use_main );

        ------------------------------------------98N 98H AT DOS-
        text_backup                                ○     * 5
        -------------------------------------------
        vtext_backup                               ×  × ○
        -------------------------------------------

                ● <98>テキスト画面の内容、カーソルの位置、ファン
                   クションキー表示行の表示状態をEMSまたはメイン
                   メモリの上位に退避先を確保して保存します。
                   ビデオモード、テキスト画面の内容、カーソル
                   の位置、 カーソルの形状をEMSまたはメインメモリ
                   の上位に退避先を確保して保存します。

                    一度保存されている場合、text_restore  を実行
                   せずに再び  text_backup を実行しようとすると必
                   ず失敗になります。
                    ems_exist()は、 内部で呼んでいるのであらかじ
                   め呼んでおく必要はありません。

                ← use_main = 0  EMSへの保存が失敗したら、失敗
                              1  〃、メインメモリ(hmem_alloc())で
                                 再挑戦

                → 1 成功
                   0 失敗

                △MEMORY: メインメモリ使用時、 次のような大きさの
                  ブロックを確保します。
                          <98>1024パラグラフ(=16KB)のブロックを確
                          保します。
                          テキスト画面の文字数に応じた大きさ
                          (80x25文字表示の時は256パラグラフ=4KB)
                          のブロックを確保します。

                ○ 事前に vtext_start()が実行されている必要が
                   あります
                ○ 内部で get_machine()を呼び出しています。

------------------------------------------------------------------------
□ text_boxfilla, vtext_boxfilla - 指定範囲の文字属性変更

C:      void text_boxfilla( unsigned x1, unsigned y1,
                           unsigned x2, unsigned y2, unsigned atrb );
C:      void vtext_boxfilla( unsigned x1, unsigned y1,
                            unsigned x2, unsigned y2, unsigned atrb );

        ------------------------------------------98N 98H AT DOS-
        text_boxfilla                              ○  ○ *
        -------------------------------------------
        vtext_boxfilla                             ×  × ○
        -------------------------------------------

                ● (x1,y1)を左上隅、(x2,y2)を右下隅とする長方形の
                   領域を、指定属性に変更します。

                ← x1,y1  左上角の座標 (x1 + 2 ≦ x2 かつ y1 +  2
                          ≦ y2 であること)
                   x2,y2  右下角の座標
                   atrb   <98>文字属性
                   atrb   上位8bit:  現在の画面の属性に対する
                                         ANDマスク
                              下位8bit:  現在の画面の属性に対する
                                         XORマスク
                          ・00h~0ffhの属性を書くだけなら通常の属
                            性として処理します。
                          ・0ff00hだと何も起こりません。
                          ・0ffffhだと全ビット反転になります。
                          ・0f007hだと、文字色のみ白にします。

                ○ 事前に vtext_start()が実行されている必要が
                   あります
                ○ vtext_refresh_on()/vtext_refresh_off()に影
                   響を受けます

------------------------------------------------------------------------
□ text_cemigraph - セミグラフィックを有効にする

C:      void text_cemigraph(void);                         マクロ

        ------------------------------------------98N 98H AT DOS-
        text_cemigraph                             ○  × *
        -----------------------------------------------------<->-

                ● テキスト画面のセミグラフィック表示機能を有効に
                   します。
                ★ ハイレゾモードではセミグラフィック表示にはなら
                   ず、常に縦線になります。

------------------------------------------------------------------------
□ text_clear, vtext_clear - テキスト画面の消去

C:      void text_clear(void);
C:      void vtext_clear(void);

        ------------------------------------------98N 98H AT DOS-
        text_clear                                        * ○
        --------------------------------------------
        vtext_clear                                ×  × ○
        --------------------------------------------

                ● テキスト画面を消去し、カーソル位置を左上に移動
                   します。
                   <98>高速コンソール出力(INT 29h)に、ANSI  ESCシ
                   ーケンスの  ESC [2J を出力することによりテキス
                   ト画面を消去します。
                   テキスト画面を消去します。グラフィックモー
                   ドになっていると何も行いません。

                ○ 事前に vtext_start(),  get_machine()が実行
                   されている必要があります
                ○ vtext_refresh_on()/vtext_refresh_off()に影
                   響を受けます

------------------------------------------------------------------------
□ text_cursor_hide, vtext_cursor_hide - カーソルを消す

C:      void text_cursor_hide(void);
C:      void vtext_cursor_hide(void);                      マクロ

        ------------------------------------------98N 98H AT DOS-
        text_cursor_hide                                  * ○
        ----------------------------------------------
        vtext_cursor_hide                          ×  × ○
        -----------------------------------------------------<->-

                ● テキストカーソルを消します。

                ○ <98> int  29h(高速コンソール出力)にESCシーケン
                   スを出力します。
                ○  BIOSを使います。

                ○ 参照:  text_cursor_show(), text_cursor_shown(),
                          vtext_cursor_show(),
                          vtext_cursor_shown()

------------------------------------------------------------------------
□ _text_cursor_off - BIOSを使用してカーソルを消す

C:      void _text_cursor_off(void);

        ------------------------------------------98N 98H AT DOS-
        _text_cursor_off                           ○     *
        -------------------------------------------

                ● BIOS ( int 18h)  を利用してカーソル表示を  off
                   にします。

                ★ text_cursor_hide()などはint  29hを使用している
                   ので  MEGDOSでは使えない、という場合にも使えま
                   す。

------------------------------------------------------------------------
□ _text_cursor_on - BIOSを使用してカーソルを表示

C:      void _text_cursor_on(void);

        ------------------------------------------98N 98H AT DOS-
        _text_cursor_on                            ○     *
        -------------------------------------------

                ● BIOS ( int 18h) を利用してカーソル表示を on に
                   します。

------------------------------------------------------------------------
□ text_cursor_show, vtext_cursor_show - カーソルを表示する

C:      void text_cursor_show(void);
C:      void vtext_cursor_show(void);                      マクロ

        ------------------------------------------98N 98H AT DOS-
        text_cursor_show                                  * ○
        ----------------------------------------------
        vtext_cursor_show                          ×  × ○
        -----------------------------------------------------<->-

                ● テキストカーソルを表示します。

                ○ <98> int  29h(高速コンソール出力)にESCシーケン
                   スを出力します。
                ○  BIOSを使います。

                ○ 参照:  text_cursor_hide(), text_cursor_shown(),
                          vtext_cursor_hide(),
                          vtext_cursor_shown()

------------------------------------------------------------------------
□ text_cursor_shown, vtext_cursor_shown - カーソルの表示状態を得る

C:      int text_cursor_shown(void);                       マクロ
C:      int vtext_cursor_shown(void);                      マクロ

        ------------------------------------------98N 98H AT DOS-
        text_cursor_shown                          ○     *
        vtext_cursor_shown                         ×  × ○
        -----------------------------------------------------<->-

                ● カーソルの表示状態を得ます。

                → 1  表示
                   0  非表示

                ○ <98> MS-DOSのワークエリアを参照します。
                ○  BIOSを使います。

                ○ 参照:  text_cursor_hide(), text_cursor_show(),
                          vtext_cursor_hide(), vtext_cursor_show()

------------------------------------------------------------------------
□ text_end - テキスト画面処理の終了

C:      void text_end(void);

        ------------------------------------------98N 98H AT DOS-
        text_end
        --------------------------------------------

                ● 中身は空です(笑)

------------------------------------------------------------------------
□ text_fillca - テキスト画面の塗りつぶし

C:      void text_fillca( unsigned ch, unsigned atrb );

        ------------------------------------------98N 98H AT DOS-
        text_fillca                                ○  ○ ×
        -------------------------------------------

                ● テキスト画面の全体を指定文字・指定属性で塗りつ
                   ぶします。30行計画に対応しています。

------------------------------------------------------------------------
□ text_frame, vtext_frame - テキストウィンドウの描画

C:      void text_frame( int x1, int y1, int x2, int y2,
                        unsigned wattr, unsigned iattr, int round );
C:      void vtext_frame( int x1, int y1, int x2, int y2,
                         unsigned wattr, unsigned iattr, int dummy );

        ------------------------------------------98N 98H AT DOS-
        text_frame                                 ○  ○ *
        --------------------------------------------
        vtext_frame                                ×  × ○
        --------------------------------------------

                ● テキスト画面に窓枠を書き、中を空白で塗り潰しま
                   す。

                ← x1,y1  左上角の座標 (x1 + 2 ≦ x2 かつ y1 +  2
                          ≦ y2 であること)
                   x2,y2  右下角の座標
                   wattr  窓枠の属性
                   iattr  中を塗り潰す属性
                   round  1 = 角を丸くする,  0 = 角は直角
                   dummy  意味なし(text_frameの引き数との数あわせ)

                ○ 枠の両側の縦線が、外側に漢字に半分かかっている
                   時は、(窓や右がずれないように)その漢字を空白に
                   置換えます。このため、テキストウィンドウの表示
                   の前に表示領域を待避するときには左右に一桁ずつ
                   多く待避してください。

                ★ 値範囲の検査はしていません。画面外や、x1 ≧ x2
                   や y1 ≧ y2 などの座標が設定されたときの動作は
                   異常になります。

                ★ <98>縦線/セミグラフは縦線モードに自動設定しま
                   す。

                ○ 事前に vtext_start(),  get_machine()が実行
                   されている必要があります

------------------------------------------------------------------------
□ text_get, vtext_get - テキスト画面の領域保存

C:      void text_get( int x1,int y1, int x2,int y2, void far *buf );
C:      void vtext_get( int x1,int y1, int x2,int y2, void far *buf );

        ------------------------------------------98N 98H AT DOS-
        text_get                                   ○     *
        -------------------------------------------
        vtext_get                                  ×  × ○
        -------------------------------------------

                ● 領域退避します。クリッピングしません。 bufには
                   あらかじめ、マクロ TX_GETSIZE(x1,y1,x2,y2)で得
                   られるバイト数の領域が必要です。

------------------------------------------------------------------------
□ text_getcurpos, vtext_getcurpos - カーソル位置を得る

C:      long text_getcurpos(void);
C:      long vtext_getcurpos(void);

        ------------------------------------------98N 98H AT DOS-
        text_getcurpos                             ○     * 5
        -------------------------------------------
        vtext_getcurpos                            ×  × ○
        -------------------------------------------

                ● カーソル位置を得ます。

                → 下位16bit  x座標( 0 = 左端 )
                   上位16bit  y座標( 0 = 上端 )

------------------------------------------------------------------------
□ text_height, vtext_height - テキスト画面の行数を得る

C:      int text_height(void);
C:      int vtext_height(void);

        ------------------------------------------98N 98H AT DOS-
        text_height                                ○     *
        ----------------------------------------------
        vtext_height                               ×  × ○
        ----------------------------------------------

                ● <98>テキスト画面の、ファンクションキー表示によ
                   って隠されていない部分の行数を得ます。
                    25行表示モードならば、 25または24(ファンクシ
                   ョンキー表示があるとき)が得られます。

                   BIOSのワークエリアを参照して、テキスト画面
                   の行数を得ます。

                ○ 参照:  text_width(), vtext_width()

------------------------------------------------------------------------
□ text_hide - テキスト画面の表示を隠す

C:      void text_hide(void);

        ------------------------------------------98N 98H AT DOS-
        text_hide                                  ○     ×
        ---------------------------------------------

                ● CRT BIOSを用いてテキスト画面の表示を隠します。

                ○ 同時に TextShown変数に 0を格納します。

------------------------------------------------------------------------
□ text_locate, vtext_locate - カーソル位置の変更

C:      void text_locate( unsigned x, unsigned y );
C:      void vtext_locate( unsigned x, unsigned y );

        ------------------------------------------98N 98H AT DOS-
        text_locate                                ○     *
        -------------------------------------------
        vtext_locate                               ×  × ○
        -------------------------------------------

                ● <98>NEC MS-DOS拡張ファンクション(INT  DCh)を使
                   ってカーソル位置を変更します。
                   MS-DOSが管理するカーソル位置を、y行目(0 が上端)
                   の x桁目(0が左端)の位置に移動します。
                   BIOSを使ってカーソル位置を設定します。

                ← x,y  カーソル位置(x=0,y=0が左上)

                ○ 事前に get_machine()が実行されている必要が
                   あります

------------------------------------------------------------------------
□ text_preset - セミグラフィック点消去

C:      void text_preset( int x, int y );

        ------------------------------------------98N 98H AT DOS-
        text_preset                                ○  × ×
        -------------------------------------------

                ● テキスト画面の指定した地点に打たれた点を消しま
                   す。点が無くなった場合、またはそこに文字が書か
                   れている場合、 その地点は文字の空白(コード0)に
                   置き換えます。

                ← x    0~159 点を消す横位置
                   y    0~99(25行の時) 点を消す縦位置

                ★ これを実行する前に必ず一度は  text_cemigraph()
                   を実行してください。
                ★ xが範囲外のとき、および  yが負数の時は実行しま
                   せん。 ただしyが画面を下にはみ出た指定をすると
                   誤動作します。

------------------------------------------------------------------------
□ text_pset - セミグラフィック点描画(属性なし)

C:      void text_pset( int x, int y );

        ------------------------------------------98N 98H AT DOS-
        text_pset                                  ○  × ×
        ---------------------------------------------

                ● テキスト画面の指定した地点に点を打ちます。文字
                   が書かれた地点を指定すると、その文字を消して新
                   たに点を打ちます。テキスト属性は変化しません。

                ← x    0~159 点を打つ横位置
                   y    0~99(25行の時) 点を打つ縦位置

                ★ これを実行する前に必ず一度は  text_cemigraph()
                   を実行してください。
                ★ xが範囲外のとき、および  yが負数の時は実行しま
                   せん。 ただしyが画面を下にはみ出た指定をすると
                   誤動作します。

------------------------------------------------------------------------
□ text_pseta - セミグラフィック点描画(属性つき)

C:      void text_pseta( int x, int y, unsigned atr );

        ------------------------------------------98N 98H AT DOS-
        text_pseta                                 ○  × ×
        --------------------------------------------

                ● テキスト画面の指定した地点に指定した属性で点を
                   打ちます。文字が書かれた地点を指定すると、その
                   文字を消して新たに点を打ちます。

                ← x    0~159 点を打つ横位置
                   y    0~99(25行の時) 点を打つ縦位置
                   atr  打つ点のテキスト属性

                ★ これを実行する前に必ず一度は  text_cemigraph()
                   を実行してください。
                ★ xが範囲外のとき、および  yが負数の時は実行しま
                   せん。 ただしyが画面を下にはみ出た指定をすると
                   誤動作します。

------------------------------------------------------------------------
□ text_put, vtext_put - テキスト画面の領域復元

C:      void text_put( int x1,int y1, int x2,int y2, const void far *buf );
C:      void vtext_put( int x1,int y1, int x2,int y2, const void far *buf );

        ------------------------------------------98N 98H AT DOS-
        text_put                                   ○     *
        -------------------------------------------
        vtext_put                                  ×     ○
        -------------------------------------------

                ● text_get()で退避された内容を画面に書き込みます。
                   bufの開放は行いません(何度でも同じ内容で
                   text_putできます)。

------------------------------------------------------------------------
□ text_putc, vtext_putc - 文字の書き込み(属性無し)

C:      void text_putc( unsigned x, unsigned y, unsigned ch );
C:      void vtext_putc( unsigned x, unsigned y, unsigned ch );

        ------------------------------------------98N 98H AT DOS-
        text_putc                                  ○  ○ *
        ---------------------------------------------
        vtext_putc                                 ×  × ○
        ---------------------------------------------

                ● テキスト画面の y行目(0 が一番上)の x桁目(0  が
                   一番左)の地点に、文字を直接書き込みます。
                    chには、ANKの他にJISコードまたはSHIFT  JISコ
                   ードで全角文字が指定できます。
                    漢字半角には対応していません。
                    書き込む地点の色、属性は変化しません。

                ★ 画面外を指定すると、関係ないメモリ内容を破壊す
                   ることになるかもしれません。

                ○ 事前に vtext_start()が実行されている必要が
                   あります
                ○ vtext_refresh_on()/vtext_refresh_off()に影
                   響を受けます

------------------------------------------------------------------------
□ text_putca, vtext_putca - 文字の書き込み(属性あり)

C:      void text_putca( unsigned x, unsigned y, unsigned ch, unsigned atrb );
C:      void vtext_putca( unsigned x, unsigned y, unsigned ch, unsigned atrb );

        ------------------------------------------98N 98H AT DOS-
        text_putca                                 ○  ○ *
        --------------------------------------------
        vtext_putca                                ×  × ○
        --------------------------------------------

                ● テキスト画面の y行目(0 が一番上)の x桁目(0  が
                   一番左)の地点に、 属性atrbで文字を直接書き込み
                   ます。
                    chには、ANKの他にJISコードまたはSHIFT  JISコ
                   ードで全角文字が指定できます。
                    漢字半角には対応していません。

                ★ 画面外を指定すると、関係ないメモリ内容を破壊す
                   ることになるかもしれません。

                ○ 事前に vtext_start(),  get_machine()が実行
                   されている必要があります
                ○ vtext_refresh_on()/vtext_refresh_off()に影
                   響を受けます

------------------------------------------------------------------------
□ text_putnp - 文字数指定のパスカル文字列の書き込み(属性無し)

C:      void text_putnp( unsigned x, unsigned y,
                        const char *passtr, unsigned wid );

        ------------------------------------------98N 98H AT DOS-
        text_putnp                                 ○  ○ ×
        --------------------------------------------

                ● text_putnsの、パスカル文字列版です。

------------------------------------------------------------------------
□ text_putnpa - 文字数指定のパスカル文字列の書き込み(属性あり)

C:      void text_putnpa( unsigned x, unsigned y,
                         const char *passtr, unsigned wid, unsigned atrb );

        ------------------------------------------98N 98H AT DOS-
        text_putnpa                                ○  ○ ×
        -------------------------------------------

                ● text_putnsa のパスカル文字列版です。

------------------------------------------------------------------------
□ text_putns, vtext_putns - 文字数指定の文字列の書き込み(属性無し)

C:      void text_putns( unsigned x, unsigned y,
                        const char * str, unsigned wid );
C:      void vtext_putns( unsigned x, unsigned y,
                         const char * str, unsigned wid );

        ------------------------------------------98N 98H AT DOS-
        text_putns                                 ○  ○ *
        --------------------------------------------
        vtext_putns                                ×  × ○
        --------------------------------------------

                ● テキスト画面の y行目(0 が一番上)の x桁目(0  が
                   一番左)から、 wid 桁(1で半角1文字分)の領域に文
                   字列を直接書き込みます。
                   文字列が wid桁を超える場合、 wid桁以内に収まる
                   最終文字まで書き込み、余った桁は空白で埋めます。
                   書き込む地点の色、属性は変化しません。

                ★ 画面外を指定すると、関係ないメモリ内容を破壊す
                   ることになるかもしれません。

                ○ 事前に vtext_start()が実行されている必要が
                   あります
                ○ vtext_refresh_on()/vtext_refresh_off()に影
                   響を受けます

------------------------------------------------------------------------
□ text_putnsa, vtext_putnsa - 文字数指定の文字列の書き込み(属性あり)

C:      void text_putnsa( unsigned x, unsigned y,
                         const char * str, unsigned wid, unsigned atrb );
C:      void vtext_putnsa( unsigned x, unsigned y,
                          const char * str, unsigned wid, unsigned atrb );

        ------------------------------------------98N 98H AT DOS-
        text_putnsa                                ○  ○ *
        -------------------------------------------
        vtext_putnsa                               ×  × ○
        -------------------------------------------

                ● テキスト画面の y行目(0 が一番上)の x桁目(0  が
                   一番左)から、wid桁(1で半角1文字分)の領域に文字
                   列を属性atrbで直接書き込みます。
                    文字列が wid 桁を超える場合、wid桁以内に収ま
                   る最終文字まで書き込み、余った桁は空白で埋めま
                   す。

                ★ 画面外を指定すると、関係ないメモリ内容を破壊す
                   ることになるかもしれません。

                ○ 事前に vtext_start()が実行されている必要が
                   あります
                ○ vtext_refresh_on()/vtext_refresh_off()に影
                   響を受けます

------------------------------------------------------------------------
□ text_putp - パスカル文字列の書き込み(属性無し)

C:      void text_putp( unsigned x, unsigned y, const char *passtr );

        ------------------------------------------98N 98H AT DOS-
        text_putp                                  ○  ○ ×
        ---------------------------------------------

                ● text_puts のパスカル文字列版です。ただし、最後
                   の文字が漢字1バイト目だったときには、そのコー
                   ドを1バイト文字として書き込みます。

------------------------------------------------------------------------
□ text_putpa - パスカル文字列の書き込み(属性あり)

C:      void text_putpa( unsigned x, unsigned y,
                        const char * str, unsigned atrb );

        ------------------------------------------98N 98H AT DOS-
        text_putpa                                 ○  ○ ×
        --------------------------------------------

                ● text_putsaのパスカル文字列版です。ただし、最後
                   の文字が漢字1バイト目だったときには、そのコー
                   ドを1バイト文字として書き込みます。

------------------------------------------------------------------------
□ text_puts, vtext_puts - 文字列の書き込み(属性無し)

C:      void text_puts( unsigned x, unsigned y, const char * str );
C:      void vtext_puts( unsigned x, unsigned y, const char * str );

        ------------------------------------------98N 98H AT DOS-
        text_puts                                  ○  ○ *
        ---------------------------------------------
        vtext_puts                                 ×  × ○
        ---------------------------------------------

                ● テキスト画面の y行目(0 が一番上)の x桁目(0  が
                   一番左)からの領域に文字列を直接書き込みます。
                    書き込む地点の色、属性は変化しません。

                ★ 画面外を指定すると、関係ないメモリ内容を破壊す
                   ることになるかもしれません。
                ★ <98>最後の文字が漢字1バイト目で終っている場合、
                   00hをみつけるまで走りつづけます。

                ○ 事前に vtext_start(),  get_machine()が実行
                   されている必要があります
                ○ vtext_refresh_on()/vtext_refresh_off()に影
                   響を受けます

------------------------------------------------------------------------
□ text_putsa, vtext_putsa - 文字列の書き込み(属性あり)

C:      void text_putsa( unsigned x, unsigned y,
                        const char * str, unsigned atrb );
C:      void vtext_putsa( unsigned x, unsigned y,
                         const char * str, unsigned atrb );

        ------------------------------------------98N 98H AT DOS-
        text_putsa                                 ○  ○ *
        --------------------------------------------
        vtext_putsa                                ×  × ○
        --------------------------------------------

                ● テキスト画面の y行目(0 が一番上)の x桁目(0  が
                   一番左)からの領域に文字列を属性atrbで直接書き
                   込みます。

                ★ 画面外を指定すると、関係ないメモリ内容を破壊す
                   ることになるかもしれません。
                ★ <98>最後の文字が漢字1バイト目で終っている場合、
                   00hをみつけるまで走りつづけます。

                ○ 事前に vtext_start(),  get_machine()が実行
                   されている必要があります
                ○ vtext_refresh_on()/vtext_refresh_off()に影
                   響を受けます

------------------------------------------------------------------------
□ text_restore, vtext_restore - テキスト画面の復元

C:      int text_restore(void);
C:      int vtext_restore(void);

        ------------------------------------------98N 98H AT DOS-
        text_restore                               ○     * 5
        -------------------------------------------
        vtext_restore                              ×  × ○
        -------------------------------------------

                ● text_backup, vtext_backup で退避したテキスト画
                   面情報を復元し、保存に使っていたメモリを開放し
                   ます。

                → 1 成功
                   0 失敗(まだ保存されていないなど)

------------------------------------------------------------------------
□ text_roll_area - スクロール範囲の指定

C:      void text_roll_area( int x1, int y1, int x2, int y2 );

        ------------------------------------------98N 98H AT DOS-
        text_roll_area                             ○     ○
        -------------------------------------------

                ● text_roll_*系関数でスクロールする範囲を指定し
                   ます。
                ★ クリッピングは行っていません。

------------------------------------------------------------------------
□ text_roll_down_c, vtext_roll_down_c - 下スクロール(属性なし)

C:      void text_roll_down_c( unsigned fillchar );
C:      void vtext_roll_down_c( unsigned fillchar );

        ------------------------------------------98N 98H AT DOS-
        text_roll_down_c                           ○     *
        --------------------------------------------
        vtext_roll_down_c                          ×  × ○
        --------------------------------------------

                ● text_roll_area()によって設定された範囲を下にス
                   クロールします。
                   属性領域はスクロールしません。
                ← fillchar  新しく現れた部分を埋める文字

                ★ fillchar に全角文字は指定できません。

                ○ 事前に vtext_start()が実行されている必要が
                   あります
                ○ vtext_refresh_on()/vtext_refresh_off()に影
                   響を受けます

------------------------------------------------------------------------
□ text_roll_down_ca, vtext_roll_down_ca - 下スクロール(属性つき)

C:      void text_roll_down_ca( unsigned fillchar, unsigned filatr );
C:      void vtext_roll_down_ca( unsigned fillchar, unsigned filatr );

        ------------------------------------------98N 98H AT DOS-
        text_roll_down_ca                          ○     *
        -------------------------------------------
        vtext_roll_down_ca                         ×  × ○
        -------------------------------------------

                ● text_roll_area()によって設定された範囲を下にス
                   クロールします。
                   属性領域もスクロールします。

                ← fillchar  新しく現れた部分を埋める文字
                   fillatr   〃 属性

                ★ fillchar に全角文字は指定できません。

                ○ 事前に vtext_start()が実行されている必要が
                   あります
                ○ vtext_refresh_on()/vtext_refresh_off()に影
                   響を受けます

------------------------------------------------------------------------
□ text_roll_left_c - 左スクロール(属性なし)

C:      void text_roll_left_c( unsigned fillchar );

        ------------------------------------------98N 98H AT DOS-
        text_roll_left_c                           ○     ×
        --------------------------------------------

                ● text_roll_area()によって設定された範囲を左にス
                   クロールします。
                   属性領域はスクロールしません。

                ← fillchar  新しく現れた部分を埋める文字

                ★ fillchar に全角文字は指定できません。

------------------------------------------------------------------------
□ text_roll_left_ca - 左スクロール(属性つき)

C:      void text_roll_left_ca( unsigned fillchar, unsigned filatr );

        ------------------------------------------98N 98H AT DOS-
        text_roll_left_ca                          ○     ×
        -------------------------------------------

                ● text_roll_area()によって設定された範囲を左にス
                   クロールします。
                   属性領域もスクロールします。

                ← fillchar  新しく現れた部分を埋める文字
                   fillatr   〃 属性

                ★ fillchar に全角文字は指定できません。

------------------------------------------------------------------------
□ text_roll_right_c - 右スクロール(属性なし)

C:      void text_roll_right_c( unsigned fillchar );

        ------------------------------------------98N 98H AT DOS-
        text_roll_right_c                          ○     ×
        --------------------------------------------

                ● text_roll_area()によって設定された範囲を右にス
                   クロールします。
                   属性領域はスクロールしません。
                ← fillchar  新しく現れた部分を埋める文字

                ★ fillchar に全角文字は指定できません。

------------------------------------------------------------------------
□ text_roll_right_ca - 右スクロール(属性つき)

C:      void text_roll_right_ca( unsigned fillchar, unsigned filatr );

        ------------------------------------------98N 98H AT DOS-
        text_roll_right_ca                         ○     ×
        -------------------------------------------

                ● text_roll_area()によって設定された範囲を右にス
                   クロールします。
                   属性領域もスクロールします。
                ← fillchar  新しく現れた部分を埋める文字
                   fillatr   〃 属性

                ★ fillchar に全角文字は指定できません。

------------------------------------------------------------------------
□ text_roll_up_c, vtext_roll_up_c - 上スクロール(属性なし)

C:      void text_roll_up_c( unsigned fillchar );
C:      void vtext_roll_up_c( unsigned fillchar );

        ------------------------------------------98N 98H AT DOS-
        text_roll_up_c                             ○     *
        --------------------------------------------
        vtext_roll_up_c                            ×  × ○
        --------------------------------------------

                ● text_roll_area()によって設定された範囲を上にス
                   クロールします。
                   属性領域はスクロールしません。

                ← fillchar  新しく現れた部分を埋める文字

                ★ fillchar に全角文字は指定できません。

                ○ 事前に vtext_start()が実行されている必要が
                   あります
                ○ vtext_refresh_on()/vtext_refresh_off()に影
                   響を受けます

------------------------------------------------------------------------
□ text_roll_up_ca, vtext_roll_up_ca - 上スクロール(属性つき)

C:      void text_roll_up_ca( unsigned fillchar, unsigned filatr );
C:      void vtext_roll_up_ca( unsigned fillchar, unsigned filatr );

        ------------------------------------------98N 98H AT DOS-
        text_roll_up_ca                            ○     *
        -------------------------------------------
        vtext_roll_up_ca                           ×  × ○
        -------------------------------------------

                ● text_roll_area()によって設定された範囲を上にス
                   クロールします。
                   属性領域もスクロールします。

                ← fillchar  新しく現れた部分を埋める文字
                   fillatr   〃 属性

                ★ fillchar に全角文字は指定できません。

                ○ 事前に vtext_start()が実行されている必要が
                   あります
                ○ vtext_refresh_on()/vtext_refresh_off()に影
                   響を受けます

------------------------------------------------------------------------
□ text_setcursor, vtext_setcursor - カーソル形状の変更

C:      void text_setcursor( int normal );
C:      void vtext_setcursor( unsigned cursor );

        ------------------------------------------98N 98H AT DOS-
        text_setcursor                             ○  ○ *
        -------------------------------------------
        vtext_setcursor                            ×  × ○
        -------------------------------------------

                ● カーソルの形状を変更します。
                   <98>GDCに直接設定します。(ハイレゾではBIOSを使
                   用)カーソル位置は変化しません。
                   BIOSで変更します。

                ← normal = 0  ブロック(通常の)カーソル
                            1  下4分の1の大きさのカーソル

                   cursor = 上位8bit: カーソル開始ラスタ(0~7)
                            下位8bit: カーソル終了ラスタ(0~7)
                            開始ラスタ > 終了ラスタの場合は非表示

                ○ 参照:  vtext_getcursor()

------------------------------------------------------------------------
□ text_show - テキスト画面の表示

C:      void text_show(void);

        ------------------------------------------98N 98H AT DOS-
        text_show                                  ○     ×
        ---------------------------------------------

                ● CRT BIOSを用いてテキスト画面を表示させます。

                ○ 同時に TextShown変数に 1を格納します。

------------------------------------------------------------------------
□ text_shown - テキスト画面の表示状態を得る

C:      int text_shown(void);                              マクロ

        ------------------------------------------98N 98H AT DOS-
        text_shown                                 ○     ×
        -----------------------------------------------------<->-

                ● TextShown変数の内容を返します。

------------------------------------------------------------------------
□ text_showpage - テキスト画面の表示ページを設定する

C:      void text_showpage( int page );

        ------------------------------------------98N 98H AT DOS-
        text_showpage                              ○  × ×
        -------------------------------------------

                ● CRT BIOSの表示領域設定を使用して、表示ページを
                   切り換えます。

                ← page  0(通常)または1(裏)

                ★ DOSを呼ぶときや、 プログラム終了前には必ず表示
                   ページを 0 に設定してください。
                ★ 30行BIOSの拡張モードになっている時は正常に動作
                   しません。 (VRAMが2頁を収納できないし)この場合
                   は、一旦 bios30_push(), bios30_setmode()を利用
                   して25行モードに設定してからこの関数を実行する
                   と良いでしょう。

------------------------------------------------------------------------
□ text_smooth - テキストスムーススクロールのシフト値を指定

C:      void text_smooth( int shiftdot );                  マクロ

        ------------------------------------------98N 98H AT DOS-
        text_smooth                                ○  × *
        -----------------------------------------------------<->-

                ● テキストスムーススクロール範囲にある文字を、上
                   にshiftdotドットもちあげます。 25行画面なら0~
                   15の値を使ってください。

------------------------------------------------------------------------
□ text_smooth_end - テキストスムーススクロールの終了

C:      void text_smooth_end(void);

        ------------------------------------------98N 98H AT DOS-
        text_smooth_end                            ○  × ×
        -------------------------------------------

                ● テキストスムーススクロール範囲を画面全体にし、
                   シフト値を 0にします。

------------------------------------------------------------------------
□ text_smooth_start - テキストスムーススクロール範囲の指定

C:      void text_smooth_start( unsigned y1, unsigned y2 );

        ------------------------------------------98N 98H AT DOS-
        text_smooth_start                          ○  × ×
        -------------------------------------------

                ● スムーススクロールを実行する範囲を設定します。

                → y1  範囲の上の行位置(0~y2)
                   y2  範囲の下の行位置(25行画面ならy1~24)

------------------------------------------------------------------------
□ text_start, vtext_start - テキスト画面処理の開始

C:      void text_start(void);
C:      void vtext_start(void);

        ------------------------------------------98N 98H AT DOS-
        text_start                                 ○  ○ *
        --------------------------------------------
        vtext_start                                ×  × ○ ○
        --------------------------------------------

                ● <98>ノーマルモードかハイレゾモードか判定して、
                   TextVramSeg に適正値を設定します。
                   テキスト処理の準備として、以下のことをしま
                   す。
                   ・TextVramWidthに現在の画面桁数を設定
                   ・TextVramSizeに桁数*行数を設定
                   ・TextVramAdrに(仮想)VRAMのアドレスを設定
                   ・仮想VRAMが存在するなら  vtext_refresh_on()、
                     存在しないなら vtext_refresh_off()を実行

                ★ 事前に get_machine()  を実行する必要があり
                   ます。

------------------------------------------------------------------------
□ text_systemline_hide, vtext_systemline_hide -  画面最下行のシステムラ
   インの消去

C:      void text_systemline_hide(void);
C:      void vtext_systemline_hide(void);

        ------------------------------------------98N 98H AT DOS-
        text_systemline_hide                              * ○
        ----------------------------------------------
        vtext_systemline_hide                      ×  × ○
        -------------------------------------------

                ● <98>ESCシーケンスを利用してファンクションキー
                   表示を消します。
                   日本語入力ドライバのために最下行を予約して
                   ある場合、それを消して全画面が使えるようにしま
                   す。

                ★ <98>int  29h(高速コンソール出力)を使用していま
                   す。

------------------------------------------------------------------------
□ text_systemline_show, vtext_systemline_show -  画面最下行のシステムラ
   インの表示

C:      void text_systemline_show(void);
C:      void vtext_systemline_show(void);

        ------------------------------------------98N 98H AT DOS-
        text_systemline_show                              * ○
        ----------------------------------------------
        vtext_systemline_show                      ×  × ○
        -------------------------------------------

                ● <98>ESCシーケンスを利用してファンクションキー
                   表示を行います。
                   日本語入力ドライバのために最下行を予約でき
                   る場合、割り当てます。

                ★ <98>int  29h(高速コンソール出力)を使用していま
                   す。

------------------------------------------------------------------------
□ text_systemline_shown, vtext_systemline_shown -  画面最下行のシステム
   ラインの表示状態を得る

C:      int text_systemline_shown(void);
C:      int vtext_systemline_shown(void);

        ------------------------------------------98N 98H AT DOS-
        text_systemline_shown                      ○     *
        ----------------------------------------------
        vtext_systemline_shown                     ×  × ○
        -------------------------------------------

                ● <98>ファンクションキー表示がされていると、 0以
                   外を返します。
                   日本語入力ドライバによって画面最下行が予約
                   されている場合、0以外を返します。

------------------------------------------------------------------------
□ text_vertical - セミグラフィックを無効にする

C:      void text_vertical(void);                          マクロ

        ------------------------------------------98N 98H AT DOS-
        text_vertical                              ○     *
        -----------------------------------------------------<->-

                ● テキスト画面のセミグラフィック表示機能を無効に
                   します。現在セミグラフィックが表示されている部
                   分は文字に化け、縦線が上書きされた表示になりま
                   す。

------------------------------------------------------------------------
□ text_vputs - 文字列の縦書き(属性なし)

C:      void text_vputs(unsigned x, unsigned y, const char *str);

        ------------------------------------------98N 98H AT DOS-
        text_vputs                                 ○  ○ ×
        --------------------------------------------

                ● 文字列を縦書きで表示します。

                ○ 半角も一行消費するので、文字列のバイト数ではな
                   く、文字数のぶんだけ進む点に注意してください。
                ○ 画面下にはみ出た部分もかまわず書き込みます。画
                   面は横幅に比べて縦が短いので、特に注意して下さ
                   い。

------------------------------------------------------------------------
□ text_vputsa - 文字列の縦書き(属性あり)

C:      void text_vputsa( unsigned x, unsigned y,
                         const char * str, unsigned atrb );

        ------------------------------------------98N 98H AT DOS-
        text_vputsa                                ○  ○ ×
        -------------------------------------------

                ● 文字列を属性付きで縦書きで表示します。

                ○ 半角も一行消費するので、文字列のバイト数ではな
                   く、文字数のぶんだけ進む点に注意してください。
                ○ 画面下にはみ出た部分もかまわず書き込みます。画
                   面は横幅に比べて縦が短いので、特に注意して下さ
                   い。

------------------------------------------------------------------------
□ text_width, vtext_width - テキスト画面の桁数を得る

C:      int text_width(void);                              マクロ
C:      int vtext_width(void);

        ------------------------------------------98N 98H AT DOS-
        text_width                                 ○     *
        -----------------------------------------------------<->-
        vtext_width                                ×  × ○
        ----------------------------------------------

                ● 現在の画面の桁数を得ます。 VTextつかってなけれ
                   ば 80 が得られます。

                ○ 参照:  text_height(), vtext_height()

------------------------------------------------------------------------
□ text_worddota - セミグラフィックの水平16ドットイメージ描画(属性つき)

C:      void text_worddota( int x, int y, unsigned image,
                           unsigned dotlen, unsigned atr );

        ------------------------------------------98N 98H AT DOS-
        text_worddota                              ○  × ×
        --------------------------------------------

                ● テキスト画面に水平にドットパターン(16dot以内)
                   を描画します。

                ← x,y     左端の開始座標( x=  -15~159,  y=0~99
                           (25行の時) )
                   image   16bitイメージ(最上位ビットが左端)
                           立っているビットはセットし、落ちている
                           ビットはリセットします。
                   dotlen  描画するドット長 (16を超えると、 image
                           を繰り返します)
                   atr     テキスト属性

                ★ クリッピングは横方向(-15~159)と、 上(0~)だけ
                   行っています。
                ★ この関数では、全てのビットが落ちたワードの、セ
                   ミグラフ属性を落としていません。

------------------------------------------------------------------------
□ TX_GETSIZE - テキスト領域保存に必要なメモリの大きさを得る

C:      TX_GETSIZE(x1,y1,x2,y2);                           マクロ

        ------------------------------------------98N 98H AT DOS-
        TX_GETSIZE
        -----------------------------------------------------<->-

                ● text_get, vtext_get に渡すための保存先メモリ領
                   域に必要な大きさを計算します。

                ← x1,y1,x2,y2   text_getに渡すものと同じ値

                → 必要なバイト数

                ○ ただの計算式ですので、 戻り値の型はx1,y1,x2,y2
                   の中で最大のものになります。(intとlongが混在し
                   ていたらlongで返る)

------------------------------------------------------------------------
□ vtext_color_98 - PC-9801文字属性を PC/AT 用に変換

C:      int vtext_color_98( int color98 );

        ------------------------------------------98N 98H AT DOS-
        vtext_color_98                             ○  ○ ○
        -------------------------------------------

                ● PC-9801 の Text 画面の文字属性を、PC/AT 用に変
                   換します。
                   98で実行した場合は引き数をそのまま返します。こ
                   のため、両用プログラム作成を助けます。

                ← color98  98用のテキスト属性

                → 動作環境用の属性
                    98ならば引き数そのまま
                    AT互換機ならば98属性のうち、色と反転ビットの
                   みを変換して返します。

                ○ 事前に get_machine()が実行されている必要があり
                   ます

------------------------------------------------------------------------
□ vtext_getcursor - カーソル形状を得る

C:      unsigned vtext_getcursor(void);

        ------------------------------------------98N 98H AT DOS-
        vtext_getcursor                            ×  × ○
        -------------------------------------------

                ● BIOSを用いてカーソル形状を得ます。

                → 上位8bit: カーソル開始ラスタ(0~7)
                   下位8bit: カーソル終了ラスタ(0~7)
                   開始ラスタ > 終了ラスタの場合は非表示

                ○ 参照:  vtext_setcursor()

------------------------------------------------------------------------
□ vtext_font_height - テキストフォントの縦ドット数を得る

C:      int vtext_font_height(void);

        ------------------------------------------98N 98H AT DOS-
        vtext_font_height                          ×  × ○
        ----------------------------------------------

                ● 1文字の縦のドット数を得ます。

------------------------------------------------------------------------
□ vtext_refresh - 仮想テキスト画面の一部の再描画

C:      void vtext_refresh( unsigned x, unsigned y, unsigned len);

        ------------------------------------------98N 98H AT DOS-
        vtext_refresh                              ×  × ○
        --------------------------------------------

                ● DOS/Vのファンクションを用いて、 テキスト画面の
                   一部を仮想VRAMの内容に更新します。

                ← x,y   開始テキスト座標
                   len   文字数

                ○ 事前に vtext_start()が実行されている必要があり
                   ます

------------------------------------------------------------------------
□ vtext_refresh_all - 仮想テキスト画面全体を再描画

C:      void vtext_refresh_all(void);

        ------------------------------------------98N 98H AT DOS-
        vtext_refresh_all                          ×  × ○ V
        -------------------------------------------

                ● DOS/Vのファンクションを用いて、 テキスト画面全
                   体を仮想VRAMの内容に更新します。
                ○ 事前に vtext_start()が実行されている必要があり
                   ます

------------------------------------------------------------------------
□ vtext_refresh_off - 描画非リフレッシュ指定

C:      void vtext_refresh_off(void);

        ------------------------------------------98N 98H AT DOS-
        vtext_refresh_off                          ×  × ○
        -------------------------------------------

                ● テキスト描画(vtext_put*()など)の度にDOS/Vの描
                   画更新ファンクションは呼ばないようにします。
                    vtext_start()実行時、非DOS/V環境と判定した場
                   合に設定されます。
                    DOS/V環境でも、 同じ場所を頻繁に書き換える場
                   合は、うまく使うと高速化が期待できます。

------------------------------------------------------------------------
□ vtext_refresh_on - 描画即リフレッシュ指定

C:      void vtext_refresh_on(void);

        ------------------------------------------98N 98H AT DOS-
        vtext_refresh_on                           ×  × ○
        -------------------------------------------

                ● テキスト描画(vtext_put*()など)の度に画面に反映
                   するようにします。
                    vtext_start()実行時、DOS/V環境と判定した場合
                   に設定されます。

------------------------------------------------------------------------
□ vtextx_end - グラフィック画面テキスト処理の終了

C:      void vtextx_end(void);

        ------------------------------------------98N 98H AT DOS-
        vtextx_end                                 ×  × ○ ○
        -------------------------------------------

                ● vtextx_startで確保したメモリを開放します。

------------------------------------------------------------------------
□ vtextx_start - グラフィック画面テキスト処理の開始

C:      void vtextx_start(void);

        ------------------------------------------98N 98H AT DOS-
        vtextx_start                               ×  × ○ ○
        -------------------------------------------

                ● ビデオモードが16色グラフィックモードであるとき
                   にこれを呼ぶと、 DOS/Vエミュレーションテキスト
                   の同等機能をビデオBIOSに付加します。これにより、
                   98用ソフトのような、グラフィックを描き、テキス
                   ト表示も行う処理の移植の負担を軽減します。

                ★ vtextx_start実行後、 videomodeを変更するとこの
                   機能は無効になりますが、メモリは開放されません。
                   vtextx_end()ではじめて開放されます。
                ★ テキスト属性はCGAのものなので、 文字の裏は透明
                   ではなく、背景色で塗り潰します。
                ○ カラーパレットを操作している場合、
                   vtext_colortable[]変数に  16色のテキストカラー
                   コードから、グラフィック画面のパレットコードへ
                   の変換表を書き込んでください。
                配列添え字がテキスト属性の色(0~15)、その値が実際
                にグラフィック画面に描画するときのパレットコード
                (0~15)です。

                △MEMORY: テキストVRAM相当(桁数*行数*2バイト)のメ
                  モリを確保します。実際の容量は、 TextVramSize*2
                  バイトです。


------------------------------------------------------------------------
■ PC-9801 30行BIOS制御 ■■■■■■■■■■■■■■■■■■■■■■■■

         PC-9801のノーマルモード機でテキスト画面の行数を増やす、
        lucifer氏の "30行BIOS"および、早紀氏の TT.com  を利用する
        関数群です。
         30行BIOSについては、30行BIOSに付属するドキュメント
        30tech.doc ((c)walker,lucifer)を参照してください。
         TTについては、パソコン通信などで入手してください。

         TT.com の場合、30行BIOS API  のエミュレーション機能があ
        ればそれを優先し、ないときには TT 1.50 の APIを使用します。

        以下のソフトに対応しています。
          30bios.com 0.08~  (現在 1.20)
          TT.com 0.90~      (現在 1.51)

------------------------------------------------------------------------
□ 構造体/グローバル変数

        ● bios30_getparam()の結果を格納する構造体

typedef struct bios30param bios30param;
struct bios30param {    ディスプレイ出力のパラメータ
    char hs;
    char vs;
    char vbp;
    char vfp;
    char hbp;
    char hfp;
};

------------------------------------------------------------------------
□ 定数

        ● bios30_tt_exist の戻り値と比較する定数
        表記               値    意味
        BIOS30_TT_OLD      0x02  TT 0.70~0.80(30bios APIなし)
        BIOS30_30BIOS_OLD  0x80  30bios 0.20未満
        BIOS30_30BIOS_020  0x81  30bios 0.20~1.20未満
        BIOS30_30BIOS_120  0x89  30bios 1.20以降
        BIOS30_TT_100      0x82  TT 1.00
        BIOS30_TT_090      0x83  TT 0.90
        BIOS30_TT_105      0x83  TT 1.05
        BIOS30_TT_150      0x06  TT 1.50~

        ● bios30_tt_exist と論理積をとって比較する定数
        表記               値    意味
        BIOS30_TT          0x02  TT

        ● bios30_setmode,bios30_getmode で使用する定数
        標準/拡張モード
        表記               値    意味
        BIOS30_MODEMASK   0x9090 (getmode)
        BIOS30_NORMAL     0x9000 (getmode/setmode)
        BIOS30_SPECIAL    0x9010 (getmode/setmode)
        BIOS30_VGA        0x9090 (getmode/setmode)
        BIOS30_LAYER      0x9080 (getmode/setmode)
        BIOS30_RATIONAL   0x9080 (getmode/setmode)

        最下行設定
        表記               値    意味
        BIOS30_FKEYMASK   0x2020 (getmode)
        BIOS30_FKEY       0x2000 (getmode/setmode)
        BIOS30_CW         0x2020 (getmode/setmode)

        行間隔設定
        表記               値    意味
        BIOS30_LINEMASK   0x0101 (getmode)
        BIOS30_WIDELINE   0x0101 (getmode/setmode)
        BIOS30_NORMALLINE 0x0100 (getmode/setmode)

        ● bios30_setclock,bios30_getclock で使用する定数
        表記               値    意味
        BIOS30_CLOCK2     0      GDC 2.5MHz
        BIOS30_CLOCK5     1      GDC 5.0MHz

------------------------------------------------------------------------
□ bios30_exist - 30行BIOS API の存在検査

C:      int bios30_exist(void);                            マクロ

        ------------------------------------------98N 98H AT DOS-
        bios30_exist                               ○  × ×
        -----------------------------------------------------<->-

                ● 30bios APIの存在検査を行います。

                → 1  30bios APIが利用できる
                   0  存在しない

                ○ 実際には bios30_tt_exist()の結果、値が
                   BIOS30_30BIOS_OLD 以上であるかどうか検査してい
                   るマクロです。このマクロは、master.lib  の古い
                   バージョンとの互換性のために存在します。
                ○ 30bios APIの存在検査です。 TTの場合は、 30bios
                   APIのエミュレーション機能がなければ 0 が返りま
                   す。

                ○ 参照:  bios30_tt_exist()

------------------------------------------------------------------------
□ bios30_getclock - 30行BIOSによるGDCクロックの取得

C:      int bios30_getclock(void);

        ------------------------------------------98N 98H AT DOS-
        bios30_getclock                            ○  × ×
        -------------------------------------------

                ● GDCクロック周波数の取得を行います。

                → BIOS30_CLOCK2  2.5MHzまたは取得失敗
                   BIOS30_CLOCK5  5.0MHz

                ○ この機能は、30行BIOS 1.20以降、TT 1.50以降で有
                   効です。

                ○ 参照:  bios30_setclock()

------------------------------------------------------------------------
□ bios30_getlimit - 30行関連の設定可能行数範囲の取得

C:      unsigned bios30_getlimit(void);

        ------------------------------------------98N 98H AT DOS-
        bios30_getlimit                            ○  × ×
        -------------------------------------------

                ● bios30_setline() によって、 設定可能な行数の範
                   囲を得ます。

                → 上位8bit=上限
                   下位8bit=下限

                ★ TT 1.50 API, 30bios 0.20 APIのどちらも存在して
                   いなければ、上限、下限とも 25 が返ります。

------------------------------------------------------------------------
□ bios30_getline - 30行BIOSの管理行数の読み取り

C:      unsigned bios30_getline(void);

        ------------------------------------------98N 98H AT DOS-
        bios30_getline                             ○  × ×
        --------------------------------------------

                ● 現在の行間隔設定に関係なく、行間あり、なしの両
                   方の場合の行数を得ます。

                → 上位バイト:  行間ありのときの行数-1
                   下位バイト:  行間なしのときの行数-1

                ★ TT 1.50 API, 30bios 0.20 APIのどちらも存在して
                   いなければ、0が返ります。

                ★ 現在の行数を得るだけならば、 text_height()を使
                   用してください。

                ○ 参照:  bios30_setline()

------------------------------------------------------------------------
□ bios30_getmode - 30行BIOSのモード取得

C:      unsigned bios30_getmode(void);

        ------------------------------------------98N 98H AT DOS-
        bios30_getmode                             ○  × ×
        -------------------------------------------

                ● 現在の30行BIOSのモードを取得します。取得結果は
                   標準/拡張モード値と最下行設定と行間隔設定と
                   0xff00 の論理和(or)になっていますので、
                   BIOS30_*MASK定数との論理積をとることで目的の種
                   類のモードを得ることができます。

                ○ 30bios 1.20 以降では、Rational  Modeのときに、
                   戻り値と BIOS30_MODEMASKの 論理積の結果が
                   BIOS30_RATIONAL になります。
                ○ TT 1.50 以降では、Graphics Layer Modeのときに、
                   戻り値と BIOS30_MODEMASKの 論理積の結果が
                   BIOS30_LAYER になります。

                ★ TT 1.50 API, 30bios  APIのどちらも存在していな
                   ければ、0が返ります。

                例:
                  switch ( bios30_getmode() & BIOS30_LINEMASK ) {
                  case BIOS30_WIDELINE :
                      /* 行間あり */
                      break;
                  case BIOS30_NORMALLINE :
                      /* 行間なし */
                      break;
                  }

                ○ 参照:  bios30_setmode()

------------------------------------------------------------------------
□ bios30_getparam - 30行BIOSのGDCパラメータの取得

C:      int bios30_getparam( int line, bios30param * param );

        ------------------------------------------98N 98H AT DOS-
        bios30_getparam                            ○  × ×
        -------------------------------------------

                ● 仮に行間なしの line 行表示に変更したときに GDC
                   に設定される各種パラメータの値を取得します。

                ← line   設定を見たい行数 ( 0 なら現在表示されて
                          いる行数 )
                   param  結果の格納先

                → 1  param に格納した
                   0  取得できない(30bios  1.10以上が常駐していな
                      い)

------------------------------------------------------------------------
□ bios30_getversion - 30行BIOS/TTのバージョン取得

C:      unsigned bios30_getversion(void);

        ------------------------------------------98N 98H AT DOS-
        bios30_getversion                          ○  × ×
        ---------------------------------------------

                ● 常駐している 30bios または TT の、バージョン番
                   号を得ます。

                → 0       30bios/TT API が存在しない
                   0以外:  上位8bit=メジャーバージョン
                           下位8bit=マイナーバージョン
                           例: 0x010a = version 1.10

------------------------------------------------------------------------
□ bios30_getvsync - 30行BIOSにによるVSYNC周波数の取得

C:      unsigned bios30_getvsync(void);

        ------------------------------------------98N 98H AT DOS-
        bios30_getvsync                            ○  × ×
        -------------------------------------------

                ● 30行BIOS 1.20以降の機能である、VSYNC周波数を取
                   得を実行します。

                → 0      30bios 1.20以上が常駐していない
                   1以上  上位8bit: 整数部  下位8bit:小数部

------------------------------------------------------------------------
□ bios30_lock - 30行BIOSの常駐解除禁止

C:      void bios30_lock(void);

        ------------------------------------------98N 98H AT DOS-
        bios30_lock                                ○  × ×
        --------------------------------------------

                ● 30行BIOS 1.20以降の機能である、 常駐解除禁止設
                   定を行います。

                ○ 参照:  bios30_unlock()

------------------------------------------------------------------------
□ bios30_pop - 30行BIOSのモード復元

C:      int bios30_pop(void);

        ------------------------------------------98N 98H AT DOS-
        bios30_pop                                 ○  × ×
        ------------------------------------------------

                ● 30行BIOS/TT内のスタックから現在の行数やモード
                   を取り出して設定します。

                → 1  成功
                   0  失敗(APIが存在しない)

                ★ プログラム終了時、 bios30_push()を実行した回数
                   だけbios30_pop()を実行してもとに戻さなければい
                   けません。

                ★ TT 1.50 API, 30bios  APIのどちらも存在していな
                   ければ、0が返ります。

                ○ 参照:  bios30_push()

------------------------------------------------------------------------
□ bios30_push - 30行BIOSのモード保存

C:      int bios30_push(void);

        ------------------------------------------98N 98H AT DOS-
        bios30_push                                ○  × ×
        ------------------------------------------------

                ● 30行BIOS/TT内のスタックへ現在の行数やモードを
                   保存します。

                → 1  成功
                   0  失敗(APIが存在しない)

                ★ TT 1.50 API, 30bios  APIのどちらも存在していな
                   ければ、0が返ります。

                ○ 参照:  bios30_pop()

------------------------------------------------------------------------
□ bios30_setclock - 30行BIOSによるGDCクロックの変更

C:      void bios30_setclock( int clock );

        ------------------------------------------98N 98H AT DOS-
        bios30_setclock                            ○  × ×
        -------------------------------------------

                ● GDCクロック周波数の変更を実行します。

                ← BIOS30_CLOCK2  2.5MHz
                   BIOS30_CLOCK5  5.0MHz

                ○ この機能は、30行BIOS 1.20以降、TT 1.50以降で有
                   効です。

                ○ 参照:  bios30_getclock()

------------------------------------------------------------------------
□ bios30_setline - 30行BIOSに行間なしの時の行数を設定する

C:      void bios30_setline( int line );

        ------------------------------------------98N 98H AT DOS-
        bios30_setline                             ○  × ×
        --------------------------------------------

                ● 行間なしの時の値で行数を設定します。  実行後、
                   bios30_setmode()を実行することにより、初めて行
                   数が変化します。

                ← line  行数

                ★ 行間ありのときに設定した場合、少ない行数で表示
                   されます。bios30_setmode()によって行間なしに設
                   定した場合に初めて指定行数になります。

                ○ 参照:  bios30_getline()

------------------------------------------------------------------------
□ bios30_setmode - 30行BIOSのモード設定

C:      void bios30_setmode( unsigned mode );

        ------------------------------------------98N 98H AT DOS-
        bios30_setmode                             ○  × ×
        -------------------------------------------

                ● 30行BIOSのモードを設定します。

                ← mode  BIOS30_*定数の中から、 setmodeの印がつい
                         たものを | (or)で組み合わせた値

                ○ 30bios 1.20 以降では、BIOS30_RATIONAL を組み合
                   わせると、Rational Mode になります。
                ○ TT 1.50 以降では、BIOS30_LAYER  を組み合わせの
                   中に設定すると Graphics Layer modeになります。

                ○ 行間の有無を変更するだけならば、text_20line(行
                   間あり), text_25line(行間なし)を呼ぶほうが画面
                   が乱れず、安全です。

                例:
                  bios30_setmode( BIOS30_FKEY );
                    最下行設定をファンクションキー表示に設定しま
                    す。
                    (行間、拡張モード指定は変化しない)

                  bios30_setmode( BIOS30_VGA | BIOS30_WIDELINE );
                    拡張モード(VGA)、行間ありに設定します。
                    (最下行設定は変化しない)

                ○ 参照:  bios30_getmode()

------------------------------------------------------------------------
□ bios30_tt_exist - 30行関連(30bios,TT)の存在検査

C:      int bios30_tt_exist(void);

        ------------------------------------------98N 98H AT DOS-
        bios30_tt_exist                            ○  × ×
        ------------------------------------------------

                ● 常駐している 30bios API の種類を調査します。

                → 0                  なにも常駐していない(TT
                                      0.70未満も含む)
                   0以外(下記参照)    常駐している
                     BIOS30_30BIOS_OLD  30bios 0.20未満
                     BIOS30_30BIOS_020  30bios 0.20~1.20未満
                     BIOS30_30BIOS_120  30bios 1.20以降
                     BIOS30_TT_OLD      TT 0.70~0.80(30bios  API
                                        なし)
                     BIOS30_TT_090      TT 0.90
                     BIOS30_TT_100      TT 1.00
                     BIOS30_TT_105      TT 1.05
                     BIOS30_TT_150      TT 1.50~
                     また、以下の式で TT であるかどうかがわかりま
                     す。
                       if ( bios30_tt_exist() & BIOS30_TT ) {
                         /* TT だ- */
                       }
                     なにか常駐してて、TT でなければ 30bios  です
                     ね。

                ○ 結果が BIOS30_30BIOS_OLD  以上であれば  30bios
                   APIは存在していることになります。
                ○ また、 BIOS30_30BIOS_020  以上であれば  30bios
                   0.20 API が存在していることになります。
                ○ 常駐しているプログラムの種類からより細かい処理
                   分けをする必要があるときに使いましょう。

                ○ 参照:  bios30_exist()

------------------------------------------------------------------------
□ bios30_unlock - 30行BIOSの常駐解除許可

C:      void bios30_unlock(void);

        ------------------------------------------98N 98H AT DOS-
        bios30_unlock                              ○  × ×
        --------------------------------------------

                ● 30行BIOS 1.20以降の機能である、 常駐解除禁止設
                   定解除を行います。

                ○ 参照:  bios30_lock()


------------------------------------------------------------------------
■ グラフィック処理 ■■■■■■■■■■■■■■■■■■■■■■■■■■


------------------------------------------------------------------------
■ グラフィック画面関係 ■■■■■■■■■■■■■■■■■■■■■■■■

         グラフィック画面に描画したり、 読み込んだりする関数群で
        す。
         画像ファイルを読み込む関数もあります。

         すべての描画の前に、かならず vga4_start  またはそれ
        に相当する処理を行う必要があります。

         文字(列)描画をする場合は、前もって font_write(),
        font_entry_bfnt(), font_entry_cgrom() などで  font_AnkSeg
        セグメントのオフセット 0 からフォントパターンを格納してお
        く必要があります。

        ● font、ank、kanji 系の関数の使い分け

         機能がほとんど同じこれらの関数が存在するにはそれなりの
        訳があります。
         まず、ank 系の関数を利用すると、SHIFT-JIS  コードに割り
        当てられている文字も ank のフォントで表示することができま
        す。また、kanji 系の関数は、font 系の関数で必要なフォント
        を準備しなくても利用できます。 font 系の関数は ank と漢字
        のまじった文字列を表示するときに使うわけです。
         もちろん、ank  系の関数では漢字は表示できないし、 kanji
        系の関数では ank は表示できないので、注意が必要ですが。

------------------------------------------------------------------------
□ 構造体/グローバル変数


        ● Pi画像ヘッダ構造体
typedef struct PiHeader PiHeader;
struct PiHeader {
    char far *comment;      /* graph_pi_load_pack()では */
                            /* NULLがsetされるだけ */
    unsigned commentlen;
    unsigned char mode;     /* bit7が立っていればパレットなし */
    unsigned char n;        /* アスペクト比 */
    unsigned char m;        /* アスペクト比 */
    unsigned char plane;    /* 4だと16色 */
    char machine[4];        /* 保存した機種, "PC98" */
    unsigned maexlen;       /* 機種予約エリアの長さ */
    void far *maex;         /* 機種予約エリアの中身 */
    unsigned xsize;         /* 画像の横ドット数 */
    unsigned ysize;         /* 画像の縦ドット数 */
    char palette[48];       /* (mode &  0x80)=0ならパレットが格納
                            される */
};

        ● MAG画像ヘッダ構造体
typedef struct MagHeader MagHeader;
struct MagHeader {
    unsigned commentseg;    /* 読み込んだコメントのセグメント */
    unsigned commentlen;    /* コメントの長さ */
    char head;
    char machine;
    char exflag;
    char scrnmode;
    int x1;                 /* 論理的な左上座標 */
    int y1;
    int x2;                 /* 論理的な右下座標 */
    int y2;
    long flagAofs;
    long flagBofs;
    long flagBsize;
    long pixelofs;
    long pixelsize;
    unsigned xsize ;        /* メモリ上データの 1ラインの横ドット
                            数 */
    unsigned ysize ;        /* メモリ上データの縦ドット数 */
    char palette[48];
};



unsigned graph_VramSeg; グラフィックVRAMの先頭アドレス
                                初期値は、0xa800になっています。
unsigned graph_VramWords;       グラフィックVRAMの1プレーンのワ
                                ード数(0~32767)が入ります。
                                初期値は、16000になっています。
unsigned graph_VramLines;       グラフィック画面のy座標のライン数
                                が入ります。通常、200または400で、
                                初期値は400です。
unsigned graph_VramWidth;       グラフィックVRAMの1ラインの横バ
                                イト数。16色(4プレーン),横640ドッ
                                トのときには 80 が入ります。
unsigned graph_VramZoom;        上位8bitは、GDCの周波数が5MHzなら
                                40h, 2.5MHzなら 0が入ります。
                                下位8bitは、画面の縦倍シフト量
                                (1dotがほぼ正方形なら0, 640x200の
                                ように縦長なら1)が入ります。
                                この変数は、graph_200line,
                                graph_400lineで設定されます。
unsigned char graph_MeshByte;   grcg_bytemesh_x, vgc_bytemesh_xで、
                                偶数ラインのときに塗り潰すパター
                                ン。初期値は0x55。 graph_VramZoom
                                が1になっているときは、  この値を
                                0xccなどに書き換えると奇麗になり
                                ます。

unsigned font_AnkSeg;           半角フォントの格納セグメント
unsigned font_AnkSize;          半角フォントの1文字の大きさ(上位
                                8bitは横dot数/8, 下位8bitは縦ドッ
                                ト数)
unsigned font_AnkPara;          半角フォント1文字の占めるパラグラ
                                フサイズ
unsigned wfont_AnkSeg;          圧縮半角フォントの格納セグメント
unsigned char wfont_Plane1;     圧縮漢字の偶数ライン描画用 GRCGモ
                                ードレジスタ設定値
unsigned char wfont_Plane2;     圧縮漢字の奇数ライン描画用 GRCGモ
                                ードレジスタ設定値
unsigned char wfont_Reg;        圧縮文字の描画時のタイルレジスタ
                                に設定する値

int at98_APage;                 at98_accesspage()に渡された値の保
                                存
int at98_VPage;                 at98_showpage()に渡された値の保存

------------------------------------------------------------------------
□ GB_GETSIZE - グラフィック領域保存に必要なメモリの大きさを得る

C:      long GB_GETSIZE(x1,y1,x2,y2);                      マクロ

        ------------------------------------------98N 98H AT DOS-
        GB_GETSIZE
        -----------------------------------------------------<->-

                ● graph_byteget, vga4_byteget で保存するときに必
                   要なメモリ領域の大きさを計算します。

                ← x1,y1,x2,y2  graph_bytegetに渡すのと同じ値。

                → 必要なバイト数(long値なので注意)

------------------------------------------------------------------------
□ graph_16color - 9821 16色モードに設定

C:      void graph_16color(void);

        ------------------------------------------98N 98H AT DOS-
        graph_16color                              ○  × ×
        ---------------------------------------------

                ● 16色モードに設定し、BIOSワークエリアを書き換え
                   ます。

                ○ 9821/A/Cでなければ何もしません。

------------------------------------------------------------------------
□ graph_200line - グラフィック画面を200lineに設定する

C:      void graph_200line( int tail );

        ------------------------------------------98N 98H AT DOS-
        graph_200line                              ○  × *
        -------------------------------------------

                ● BIOSを用いて 640x200dotモードに設定します。
                   書き込みページは0にします。
                   tail =  0  の場合、 グラフィック画面の前半分、
                   tail = 1 の場合、後ろ半分を選択します。

                   グローバル変数を、下記のように設定します。
                        graph_VramSeg =
                                tailが0: 0xa800
                                tailが1: 0xabe8
                        graph_VramWords = 8000
                        graph_VramLines = 200
                        graph_VramZoom = 1

                   また、grc_setclipのクリッピング領域を  640x200
                   全体に設定します。

                ○ 実際には、以下のことをします。
                    1. vga4_start(0x8e,640,200)
                    2.
                graph_VramSeg=ClipYT_seg=(0xa000+((t)&1)*400*5)
                    3. at98_showpage(at98_VPage)
                    4. at98_accesspage(at98_APage)
                    5. vtextx_start()
                     すなわち、 640x200dotモードのドットの縦の大
                    きさを半分にすることで、640x400を実現していま
                    す。

                ★ AT互換機では、パレットは初期化されます。

------------------------------------------------------------------------
□ graph_24kHz - 9821水平周波数を24kHzに設定する

C:      void graph_24kHz(void);                            マクロ

        ------------------------------------------98N 98H AT DOS-
        graph_24kHz                                ○  × ×
        -----------------------------------------------------<->-

                ● 水平周波数を 24kHzにします。

                ○ 9821/A/Cでなければ何もしません。

------------------------------------------------------------------------
□ graph_256color - 9821 256色モードに設定

C:      void graph_256color(void);

        ------------------------------------------98N 98H AT DOS-
        graph_256color                             ○  × ×
        ---------------------------------------------

                ● 256色モードに設定し、 BIOSワークエリアを書き換
                   えます。

                ○ 9821/A/Cでなければ何もしません。

                ★ master.libには、256色描画関数はありません。 注
                   意してください。

------------------------------------------------------------------------
□ graph_31kHz - 9821水平周波数を31kHzに設定する

C:      void graph_31kHz(void);                            マクロ

        ------------------------------------------98N 98H AT DOS-
        graph_31kHz                                ○  × ×
        -----------------------------------------------------<->-

                ● 水平周波数を 31kHzにします。

                ○ 9821/A/Cでなければ何もしません。

------------------------------------------------------------------------
□ graph_400line, at98_graph_400line - グラフィック画面を400lineに設定す
   る

C:      void graph_400line(void);
C:      void at98_graph_400line(void);

        ------------------------------------------98N 98H AT DOS-
        graph_400line                              ○  × *
        -------------------------------------------
        at98_graph_400line                         ×  × ○
        -------------------------------------------

                ● BIOSを用いて 640x400dotモードに設定します。
                   書き込みページは0にします。

                   グローバル変数を、下記のように設定します。
                        graph_VramSeg = 0xa800
                        graph_VramWords = 16000
                        graph_VramLines = 400
                        graph_VramZoom = <98>(GDCが5MHzなら
                        0x4000, 2.5MHzなら0)
                                         0

                   また、grc_setclipのクリッピング領域を  640x400
                   全体に設定します。

                ○ 実際には、以下のことをします。
                    1. vga4_start(0x8e,640,400)
                    2. vga_vzoom_off()
                    3. at98_showpage(at98_VPage)
                    4. at98_accesspage(at98_APage)
                    5. vtextx_start()
                     すなわち、 640x200dotモードのドットの縦の大
                    きさを半分にすることで、640x400を実現していま
                    す。

                ★ AT互換機では、パレットは初期化されます。

------------------------------------------------------------------------
□ graph_480line - 9821画面を480lineモードに設定する

C:      void graph_480line(void);                          マクロ

        ------------------------------------------98N 98H AT DOS-
        graph_480line                              ○  × ×
        -----------------------------------------------------<->-

                ● 480ラインモードにします。

                ○ 9821/A/Cでなければ何もしません。

------------------------------------------------------------------------
□ graph_accesspage, at98_accesspage - グラフィック画面CPUアクセスページ
   設定

C:      void graph_accesspage( int page );                 マクロ
C:      void at98_accesspage( int page );

        ------------------------------------------98N 98H AT DOS-
        graph_accesspage                           ○  × *
        -----------------------------------------------------<->-
        at98_accesspage                            ×  × ○
        -------------------------------------------

                ● CPUがアクセスするページを指定します。
                   pageには、0 または 1 が指定できます。

                ○  graph_VramSeg, ClipYT_seg  変数を操作しま
                   す。

------------------------------------------------------------------------
□ graph_analog - パレットモードをアナログ16色にする

C:      void graph_analog(void);                           マクロ

        ------------------------------------------98N 98H AT DOS-
        graph_analog                               V  × ×
        -----------------------------------------------------<->-

                ● I/Oポートを直接アクセスして、 アナログパレット
                   モードに設定します。

------------------------------------------------------------------------
□ graph_ank_putc - 半角文字の描画

C:      void graph_ank_putc( int x, int y, int c, int color );

        ------------------------------------------98N 98H AT DOS-
        graph_ank_putc                             V  × *
        -------------------------------------------

                ● グラフィック画面へ半角文字(8x16dot)を1文字描画
                   します。

                ← x,y    左上座標
                   c      文字コード(0~255)
                   color  色(0~15)

                ★ フォントデータは font_write()や
                   font_entry_bfnt(), font_entry_cgrom() であらか
                   じめ登録してある必要があります。
                ★ クリッピングは行っていません。

------------------------------------------------------------------------
□ graph_ank_putp - 半角(パスカル)文字列の描画

C:      void graph_ank_putp( int x, int y, int step,
                            const char *passtr, int color );

        ------------------------------------------98N 98H AT DOS-
        graph_ank_putp                             V  × ×
        -------------------------------------------

                ● グラフィック画面に半角文字(8x16dot)列を描画し
                   ます。

                ← x,y    左上座標
                   step   文字間隔(8でぴったり連続します)
                   str    パスカル文字列の先頭アドレス
                   color  色(0~15)

                ★ 漢字の混在はできません。
                ★ フォントデータは font_write()や
                   font_entry_bfnt(), font_entry_cgrom() であらか
                   じめ登録してある必要があります。
                ★ クリッピングは行っていません。

------------------------------------------------------------------------
□ graph_ank_puts - 半角文字列の描画

C:      void graph_ank_puts( int x, int y, int step,
                            const char * str, int color );

        ------------------------------------------98N 98H AT DOS-
        graph_ank_puts                             V  × *
        -------------------------------------------

                ● グラフィック画面に半角文字(8x16dot)列を描画し
                   ます。

                ← x,y    左上座標
                   step   文字間隔(8でぴったり連続します)
                   str    文字列の先頭アドレス
                   color  色(0~15)

                ★ 漢字の混在はできません。混在するには、
                   graph_font_puts()を使用してください。
                ★ フォントデータは font_write()や
                   font_entry_bfnt(), font_entry_cgrom() であらか
                   じめ登録してある必要があります。
                ★ クリッピングは行っていません。

------------------------------------------------------------------------
□ graph_clear, vga4_clear - グラフィック画面の消去

C:      void graph_clear(void);
C:      void vga4_clear(void);

        ------------------------------------------98N 98H AT DOS-
        graph_clear                                V  × *
        -------------------------------------------
        vga4_clear                                 ×  × ○
        -------------------------------------------

                ● グラフィック画面の表示領域を 0  番の色で塗り潰
                   します。
                   <98>GRCGを用いて消去します。

                ○ 塗りつぶす領域は、セグメント graph_VramSeg  の
                   オフセット  0 から、graph_VramWords * 2 バイト
                   分です。

------------------------------------------------------------------------
□ graph_copy_page - グラフィック画面の内容を他のページから複写する

C:      int graph_copy_page( int to_page );

        ------------------------------------------98N 98H AT DOS-
        graph_copy_page                            ○  × * ○
        --------------------------------------------

                ● グラフィック画面の指定ページへ、反対のページの
                   内容を転写し、アクセスページを  コピー先の頁に
                   設定します。

                ← to_page   コピー先の頁(0または1)

                → 1  成功
                   0  <98>失敗(smem_wget()によって 32KBのメモリが
                      確保できなかった)

                △MEMORY: <98>この関数の内部で、一時的に VRAM 1プ
                  レーン分(640x400時、32KB)の領域を確保し、開放し
                  ます。

------------------------------------------------------------------------
□ graph_backup - グラフィック画面(表裏とも)のEMSへの保存

C:      int graph_backup( int pagemask );

        ------------------------------------------98N 98H AT DOS-
        graph_backup                               ○  × ×
        -------------------------------------------

                ● グラフィック画面の表、裏、または両方を、格納で
                   きる必要な大きさをEMSに確保して保存します。
                    ems_exist()は、 内部で呼んでいるのであらかじ
                   め呼んでおく必要はありません。
                ← pagemask = G_PAGE0   表頁を保存する(EMS  128KB
                                        使用)
                              G_PAGE1   裏頁を保存する(EMS  128KB
                                        使用)
                              G_ALLPAGE  表裏両方の画面を保存する
                              (EMS 256KB使用)
                              上記以外の値を指定した場合、 動作は
                              不定です。

                → 1  成功
                   0  失敗(EMSがない、足りない、 すでに退避してあ
                      る、pagemaskが異常)

------------------------------------------------------------------------
□ graph_bfnt_putc, vgc_bfnt_putc - BFNT文字の描画

C:      void graph_bfnt_putc( int x, int y, int ank, int color );
C:      void vgc_bfnt_putc( int x, int y, int ank );

        ------------------------------------------98N 98H AT DOS-
        graph_bfnt_putc                            V  × *
        -------------------------------------------
        vgc_bfnt_putc                              ×  × ○
        -------------------------------------------

                ● 文字をグラフィック画面に描画します。

                ← x,y    描画開始左上座標
                   ank    文字コード(0~255)
                   color  色(0~15) (graph_bfnt_putcのみ)

                ○ vgc_bfnt_putc は、色は vgc_setcolor で指定しま
                   す。

                ★ フォントデータはあらかじめ   font_entry_bfnt()
                   などで登録しておいてください。
                ★ クリッピングは行っていません。

------------------------------------------------------------------------
□ graph_bfnt_putp - パスカル文字列描画(BFNT)

C:      void graph_bfnt_putp(   int   x,   int   y,   int   step,
                             char * passtr, int color);

        ------------------------------------------98N 98H AT DOS-
        graph_bfnt_putp                            V  × ×
        -------------------------------------------

                ● graph_ank_putpの文字サイズ対応版です。大きさは
                   font_AnkSize に対応します。

                ← x,y     描画左上座標
                   step    1文字ごとに進めるドット数(0=移動しない)
                   str     パスカル文字列(ANKのみ)
                   color   色 (0~15)

                ★ フォントデータはあらかじめ   font_entry_bfnt()
                   などで登録しておいてください。
                ★ クリッピングは行っていません。

------------------------------------------------------------------------
□ graph_bfnt_puts, vgc_bfnt_puts - BFNT文字列の描画

C:      void graph_bfnt_puts( int x, int y, int step, char * ank,
                             int color);
C:      void vgc_bfnt_puts( int x, int y, int step, char * ank );

        ------------------------------------------98N 98H AT DOS-
        graph_bfnt_puts                            V  × *
        -------------------------------------------
        vgc_bfnt_puts                              ×  × ○
        -------------------------------------------

                ● graph_ank_putsの文字サイズ対応版です。大きさは
                   font_AnkSize に対応します。

                ← x,y     描画左上座標
                   step    1文字ごとに進めるドット数(0=移動しない)
                   str     文字列(ANKのみ)
                   color   色(0~15) (graph_bfnt_putsのみ)

                ○ vgc_bfnt_puts は、色は vgc_setcolor で指定しま
                   す。

                ★ フォントデータはあらかじめ   font_entry_bfnt()
                   などで登録しておいてください。
                ★ クリッピングは行っていません。

------------------------------------------------------------------------
□ graph_byteget, vga4_byteget - グラフィック画面の領域保存

C:      void graph_byteget( int cx1,int y1, int cx2,int y2, void far *buf );
C:      void vga4_byteget( int cx1,int y1, int cx2,int y2, void far *buf );

        ------------------------------------------98N 98H AT DOS-
        graph_byteget                              ○  × *
        --------------------------------------------
        vga4_byteget                               ×  × ○
        --------------------------------------------

                ● 横8ドット単位での領域保存です。

                ← cx1,cx2  テキスト座標で横位置。cx1は必ず左で、
                            cx2は右
                   y1,y2    グラフィック座標の縦位置。y1が上、 y2
                            が下
                   buf      マクロ  GB_GETSIZE(cx1,y1,cx2,y2)バイ
                            ト以上のメモリ領域

                ★ クリッピングは行っていません。

------------------------------------------------------------------------
□ graph_byteput, vga4_byteput - グラフィック画面の領域復元

C:      void graph_byteput( int cx1,int y1, int cx2,int y2, const
                           void far *buf );
C:      void vga4_byteput( int cx1,int y1, int cx2,int y2,  const
                          void far *buf );

        ------------------------------------------98N 98H AT DOS-
        graph_byteput                              ○  × *
        --------------------------------------------
        vga4_byteput                               ×  × ○
        --------------------------------------------

                ● graph_byteget()で退避した画面部分を表示します。

                ← cx1,cx2  テキスト座標で横位置。cx1は必ず左で、
                            cx2は右
                   y1,y2    グラフィック座標の縦位置。y1が上、 y2
                            が下
                   buf      graph_bytegetで退避したバッファ

                ★ クリッピングは行っていません。

------------------------------------------------------------------------
□ graph_crt - 画面のドットずれ補正解除

C:      void graph_crt(void);                              マクロ

        ------------------------------------------98N 98H AT DOS-
        graph_crt                                  V  × ×
        -----------------------------------------------------<->-

                ● I/Oポートを直接アクセスして、 グラフィック画面
                   とテキスト画面の表示位置を 1ドットずらします。

                ○ システム起動時は 1ドットずれていますが、現在の
                   状態を知ることができないし、普段一致させている
                   人もいるので、ドットずれ補正した後にわざわざず
                   らす必要はないでしょう。

------------------------------------------------------------------------
□ graph_digital - パレットモードをデジタル8色にする

C:      void graph_digital(void);                          マクロ

        ------------------------------------------98N 98H AT DOS-
        graph_digital                              V  × ×
        -----------------------------------------------------<->-

                ● I/Oポートを直接アクセスして、 デジタルパレット
                   (8色)モードに設定します。

                ★ master.libの関数は、 デジタル8色モードでのパレ
                   ット操作はできません。

------------------------------------------------------------------------
□ graph_end, vga4_end - グラフィック画面一括終了処理

C:      void graph_end(void);
C:      void vga4_end(void);

        ------------------------------------------98N 98H AT DOS-
        graph_end                                  V  × *
        ---------------------------------------------
        vga4_end                                   ×  × ○
        -------------------------------------------

                ● <98>終了のために、以下の処理を行います。
                   graph_hide
                   graph_400line
                   graph_clear

                   ビデオモードを  vga4_startで記録した値に設
                   定します。
                   また、VTextState変数を 0x7fffでANDします。

------------------------------------------------------------------------
□ graph_enter - グラフィック画面を消さない初期設定

C:      void graph_enter(void);

        ------------------------------------------98N 98H AT DOS-
        graph_enter                                V  × *
        -------------------------------------------

                ● 開始のために、以下の処理を行います。

                   1. graph_plasma
                   2. 常駐パレットが存在すれば読み取り、 なければ
                   Palettes を初期化して PaletteTone=100,
                   graph_analog() を実行する
                   3. graph_400line
                   4. graph_show

------------------------------------------------------------------------
□ graph_extmode - 9821拡張グラフィックモードの設定/取得

C:      unsigned graph_extmode( unsigned modmask, unsigned bhal );

        ------------------------------------------98N 98H AT DOS-
        graph_extmode                              ○  × ×
        -------------------------------------------

                ● PC-9821/A/Cシリーズの拡張CRT  BIOSを使用して、
                   各種画面モードを制御します。

                ← modmask  上位8bit:  BHレジスタの操作するビット
                            に1を立てたマスク
                            下位8bit: AL〃
                   bhal     上位8bit: BHレジスタに設定する値
                            下位8bit: AL〃

                → 設定後の BH,ALレジスタの値

                ビットの内容:
                  AL  b7 b6 b5 b4 b3 b2 b1 b0
                                  || ||    ++- 0 ノンインターレー
                                           ス
                                  || ||        1 インターレース
                                  ++-++------- 00 15.98kHz(98GS)
                                               10 24.83kHz
                                               11 31.47kHz
                  BH  b7 b6 b5 b4 b3 b2 b1 b0
                            || ||       ++-++- 00 20行
                            || ||              01 25行
                            || ||              10 30行
                            ++-++------------- 00 640x200(UPPER)
                                               01 640x200(LOWER)
                                               10 640x400
                                               11 640x480

                ○ modmaskを 0にすることで、 現在のモード値を取得
                   できます。
                ○ 逆に、modmaskを0ffffhにすることで、 すべてのビ
                   ットを操作することになります。
                ○ 9821/A/Cでなければ何もせず、常に 0 を返します。

------------------------------------------------------------------------
□ graph_font_put, vgc_font_put - 1文字描画

C:      void graph_font_put( int x, int y, const char * str, int color );
C:      void vgc_font_put( int x, int y, const char * str );

        ------------------------------------------98N 98H AT DOS-
        graph_font_put                             V  × *
        --------------------------------------------
        vgc_font_put                               ×  × ○
        --------------------------------------------

                ● グラフィック画面に、文字列の最初の1文字
                   (8x16dotまたは16x16dot)を描画します。
                   全角・半角のどちらも描画できます。

                ← x,y    左上座標
                   str    文字列の先頭アドレス
                   color  色(0~15) (graph_font_putのみ)

                ★ フォントデータは font_write()や
                   font_entry_bfnt(), font_entry_cgrom() であらか
                   じめ登録してある必要があります。
                ★ クリッピングは行っていません。

                ○ vgc_font_put は、色は vgc_setcolor  で指定しま
                   す。
                ○ 日本語テキストモード以外で処理す
                   るためには、日本語テキストモードのうちに
                   font_at_init()を実行しておく必要があります。

------------------------------------------------------------------------
□ graph_font_putp - パスカル文字列描画

C:      void graph_font_putp( int x, int y, int step,
                             const char * passtr, int color );

        ------------------------------------------98N 98H AT DOS-
        graph_font_putp                            V  × ×
        -------------------------------------------

                ● グラフィック画面へ文字列を描画します。

                ← x,y    左上座標
                   step   文字間隔(全角文字の幅を基準にするので、
                          16でぴったり連続します。 半角文字はこの
                          指定の半分(端数切り捨て)だけ進みます)
                   str    パスカル文字列
                   color  色(0~15)

                ★ 漢字半角には対応していません。
                ★ フォントデータは font_write()や
                   font_entry_bfnt(), font_entry_cgrom() であらか
                   じめ登録してある必要があります。
                ★ クリッピングは行っていません。

------------------------------------------------------------------------
□ graph_font_puts, vgc_font_puts - 文字列描画

C:      void graph_font_puts( int x, int y, int step,
                             const char * str, int color );
C:      void vgc_font_puts( int x, int y, int step, const char * str );

        ------------------------------------------98N 98H AT DOS-
        graph_font_puts                            V  × *
        -------------------------------------------
        vgc_font_puts                              ×  × ○
        -------------------------------------------

                ● グラフィック画面へ文字(8x16dotまたは16x16dot)
                   列を描画します。

                ← x,y    左上座標
                   step   文字間隔(全角文字の幅を基準にするので、
                          16でぴったり連続します。 半角文字はこの
                          指定の半分(端数切り捨て)だけ進みます)
                   str    文字列の先頭アドレス
                   color  色(0~15) (graph_font_putsのみ)

                ★ 漢字半角には対応していません。
                ★ フォントデータは font_write()や
                   font_entry_bfnt(), font_entry_cgrom() であらか
                   じめ登録してある必要があります。
                ★ クリッピングは行っていません。

                ○ vgc_font_puts は、色は vgc_setcolor で指定しま
                   す。
                ○ 日本語テキストモード以外で処理
                   するためには、日本語テキストモードのうちに
                   font_at_init()を実行しておく必要があります。

------------------------------------------------------------------------
□ graph_gaiji_putc - 外字描画

C:      void graph_gaiji_putc( int x, int y, int c, int color );

        ------------------------------------------98N 98H AT DOS-
        graph_gaiji_putc                           V  × ×
        -------------------------------------------

                ● グラフィック画面に外字(16x16dot)を描画します。

                ← x,y     描画左上座標
                   c       外字コード( 0~0ffh )

                ★ クリッピングは行っていません。

------------------------------------------------------------------------
□ graph_gaiji_puts - 外字文字列描画

C:      void graph_gaiji_puts( int x, int y, int step,
                              const char * str, int color );

        ------------------------------------------98N 98H AT DOS-
        graph_gaiji_puts                           V  × ×
        -------------------------------------------

                ● グラフィック画面に外字(16x16dot)文字列を描画し
                   ます。

                ← x,y     描画左上座標
                   step    1文字ごとに進めるドット数(0=移動しない)
                   str     外字文字列(ANKのみ)
                   color   色 (0~15)

                ★ クリッピングは行っていません。

------------------------------------------------------------------------
□ graph_getextmode - 9821拡張グラフィックモードの取得

C:      unsigned graph_getextmode(void);                   マクロ

        ------------------------------------------98N 98H AT DOS-
        graph_getextmode                           ○  × ×
        -----------------------------------------------------<->-

                ● 現在の9821/A/C拡張モードの状態を得ます。

                → 上位8bit:  BHの値
                   下位8bit:  ALの値

                ○ ビット内容については graph_extmode 参照
                ○ 9821/A/Cでなければ常に 0 を返します。

------------------------------------------------------------------------
□ graph_hide - グラフィック画面の表示を隠す

C:      void graph_hide(void);

        ------------------------------------------98N 98H AT DOS-
        graph_hide                                 ○  × ×
        --------------------------------------------

                ● BIOSを用いてグラフィック画面の表示を隠します。

------------------------------------------------------------------------
□ graph_is256color - 9821 256色モードかどうか判定

C:      int graph_is256color(void);

        ------------------------------------------98N 98H AT DOS-
        graph_is256color                           ○  × ×
        ---------------------------------------------

                ● BIOSワークエリアを参照して、 256色モードかどう
                   か判定します。

                → 0      16色モード
                   0以外  256色モード

                ○ 9821/A/Cでなければ 0を返します。

------------------------------------------------------------------------
□ graph_is31kHz - 9821が水平周波数31kHzかどうか得る

C:      int graph_is31kHz(void);                           マクロ

        ------------------------------------------98N 98H AT DOS-
        graph_is31kHz                              ○  × ×
        -----------------------------------------------------<->-

                ● 31kHzなら 1(true)を返します。

                ○ 9821/A/Cでなければ常に 0 を返します。

------------------------------------------------------------------------
□ graph_kanji_put - 全角文字描画

C:      void graph_kanji_put( int x, int y, const char * str, int color );

        ------------------------------------------98N 98H AT DOS-
        graph_kanji_put                            V  × *
        --------------------------------------------

                ● グラフィック画面へ全角文字(16x16dot)を描画しま
                   す。

                ← x,y    左上座標
                   str    文字列の先頭アドレス。この1文字目が描画
                          されます。
                   color  色(0~15)

                ★ 漢字半角には対応していません。
                ★ クリッピングは行っていません。

------------------------------------------------------------------------
□ graph_kanji_large_put - 4倍角漢字描画

C:      void graph_kanji_large_put( int x, int y,
                                   const char * str, int color );

        ------------------------------------------98N 98H AT DOS-
        graph_kanji_large_put                      V  × ×
        -------------------------------------------

                ● グラフィック画面に、 全角文字を4倍角で描画しま
                   す。

                ← x,y    左上座標
                   str    文字列の先頭アドレス(この1文字目が描画
                          されます)
                   color  色(0~15)

                ★ 半角文字には対応していません。
                ★ クリッピングは行っていません。

------------------------------------------------------------------------
□ graph_kanji_puts - 全角文字列描画

C:      void graph_kanji_puts( int x, int y, int step,
                              const char * str, int color );

        ------------------------------------------98N 98H AT DOS-
        graph_kanji_puts                           V  × *
        -------------------------------------------

                ● グラフィック画面に、全角文字(16x16dot)のみで構
                   成された文字列を描画します。

                ← x,y    左上座標
                   step   文字間隔(16でぴったり連続します)
                   str    文字列の先頭アドレス
                   color  色(0~15)

                ★ 漢字半角には対応していません。
                ★ クリッピングは行っていません。

------------------------------------------------------------------------
□ graph_leave - グラフィック画面を消さない終了処理

C:      void graph_leave(void);                            マクロ

        ------------------------------------------98N 98H AT DOS-
        graph_leave                                V  × ×
        -----------------------------------------------------<->-

                ● 終了のために、以下の処理を行います。

                   respal_set_palettes

------------------------------------------------------------------------
□ graph_pack_get_8, vga4_pack_get_8 - パックデータ読み取り(8dot単位)

C:      void graph_pack_get_8( int x, int y, void far * linepat, int len );
C:      void vga4_pack_get_8( int x, int y, void far * linepat, int len );

        ------------------------------------------98N 98H AT DOS-
        graph_pack_get_8                           V  × *
        -------------------------------------------
        vga4_pack_get_8                            ×  × ○
        -------------------------------------------

                ● グラフィック画面から水平に1バイトに2dot詰めて
                   メモリに読み込みます。
                ← x        左端座標( 8の倍数に切り捨てます )
                   y        描画 y 座標
                   linepat  読み込み先の先頭アドレス
                             このデータは、1バイトの上位4bitに左
                            側、 下位4bitに右側のカラーコードを格
                            納して2bitを表す形式のデータ列で、 16
                            色のときの BFNT+, BMP(DIB), magの圧縮
                            前のときの状態と同じです。
                             ★len/2バイトの領域を用意してくださ
                                い。
                   len      横ドット数( 8の倍数に切り捨てられます
                            )

                ★ クリッピングは上下は grc_setclip範囲、左右は画
                   面幅で行っています。
                   クリッピング範囲外の領域は読み込みません。

------------------------------------------------------------------------
□ graph_pack_put_8, vga4_pack_put_8 - パックデータ描画(8dot単位)

C:      void graph_pack_put_8( int x, int y,
                              const void far * linepat, int len );
C:      void vga4_pack_put_8( int x, int y,
                             const void far * linepat, int len );

        ------------------------------------------98N 98H AT DOS-
        graph_pack_put_8                           V  × *
        -------------------------------------------
        vga4_pack_put_8                            ×  × ○
        -------------------------------------------

                ● 1バイトに2dot詰めたグラフィックイメージデータ
                   を1line描画します。

                ← x        左端座標( 8の倍数に切り捨てます )
                   y        描画 y 座標
                   linepat  パターンデータの先頭(左端)アドレス
                             このデータは、1バイトの上位4bitに左
                            側、 下位4bitに右側のカラーコードを格
                            納して2bitを表す形式のデータ列で、 16
                            色のときの BFNT+, BMP(DIB), magの圧縮
                            前のときの状態と同じです。
                   len      横ドット数( 8の倍数に切り捨てられます
                            )

                ★ クリッピングは上下は grc_setclip範囲、左右は画
                   面幅で行っています。

------------------------------------------------------------------------
□ graph_pi_comment_load - Pi画像ファイルのコメント部分読み込み

C:      int graph_pi_comment_load( const char * filename, PiHeader * header );

        ------------------------------------------98N 98H AT DOS-
        graph_pi_comment_load                                ○
        -------------------------------------------

                ● Pi形式ファイルのコメントを読み込み、メモリ上に
                   読み込んだアドレスを header.comment に格納しま
                   す。

                ← filename    ファイルファイル名
                   header      ヘッダ情報格納場所

                → NoError             成功, またはコメントがない
                   FileNotFound        ファイルがない
                   InvalidData         Piファイルじゃない
                   InsufficientMemory  メモリが足りない
                   InvalidData         サイズが  PiHeaderに書いて
                                       あるより小さい

                ○ NoError以外のときは、PiHeaderのcommentフィール
                   ドは 0 にセットされます。

                ○ 読み込んだコメントを含む  PiHeaderの内容の開放
                   には、graph_pi_free を使用してください。

                ★ graph_pi_load_* によってヘッダ情報をあらかじめ
                   格納しておく必要があります。

                例: graph_pi_load_pack参照

                △MEMORY:  コメントデータに必要なメモリブロックを
                  確保します。

                ○ 参照:  graph_pack_put_8(),
                          graph_pi_comment_load(),
                          graph_pi_free(),  graph_pi_load_pack(),
                          mag_free(), mag_load_pack(),
                          vga4_pack_put_8()

------------------------------------------------------------------------
□ graph_pi_free - Pi画像をメモリから開放

C:      void graph_pi_free( PiHeader * header, void far * image );

        ------------------------------------------98N 98H AT DOS-
        graph_pi_free
        -------------------------------------------

                ● 読み込んだPi画像のヘッダから、 (もし読み込んだ
                   なら)comment, (もし存在したら)機種予約エリアを
                   開放し、image(画像データ)も開放します。

                ← header   Piヘッダ
                   image    graph_pi_load_packでbufptrに返された
                            アドレス

                ○ 開放すると、headerの中の以下のメンバデータは 0
                   に初期化されます。
                    comment, commentlen, maexlen, maex

                ○ 画像データだけを先に単独で開放した場合
                   ( hmem_free(FP_SEG(image))  )、 この関数の引数
                   image  にはそのアドレスは渡さずに、NULL を渡し
                   て下さい。

                ★ graph_pi_load_packによってメモリに読み込んだ画
                   像が不要になったら、必ずこの関数で開放してくだ
                   さい。

                例: graph_pi_load_pack参照

                ○ 参照:  graph_pack_put_8(),
                          graph_pi_comment_load(),
                          graph_pi_free(),  graph_pi_load_pack(),
                          mag_free(), mag_load_pack(),
                          vga4_pack_put_8()

------------------------------------------------------------------------
□ graph_pi_load_pack - 16色Pi画像fileのメモリへの読み込み(1バイト=2dot)

C:      int graph_pi_load_pack( const char * filename,
                               PiHeader * header, void far **bufptr );

        ------------------------------------------98N 98H AT DOS-
        graph_pi_load_pack                                   ○
        -------------------------------------------

                ● 16色  Pi形式ファイルの画像データ及びヘッダ情報
                   を読み込みます。

                ← filename  Pi画像ファイル名
                   header    ヘッダ情報格納場所
                   bufptr    画像データの先頭アドレスの格納先

                → NoError             読み込み成功(bufptrにアド
                                       レスを格納した)
                   FileNotFound        ファイルが見つからない
                   InvalidData         16色Piファイルではない
                   InsufficientMemory  メモリ不足

                ○ やなぎさわ氏の作成した画像フォーマット Pi 形式
                   のファイルを読み込みます。
                ○ コメントを読み込むには、この関数を実行した後で
                   graph_pi_comment_load を実行してください。
                ○ 読み込んだ画像データの表示は、
                   graph_pack_put_8() を用いて header.xsize / 2バ
                   イトずつ進めながら 1line分ずつ表示してください。
                ○ 読み込んだ  PiHeaderの内容および画像データの開
                   放には、graph_pi_free を使用してください。
                ○ パレットデータは、headerに入っています。表示す
                   るには、palette_set_all( header.palette ) を実
                   行してください。

                ○ 画像のために確保されるメモリは、
                   (xsize/2*(ysize+2))バイトです。

                ★ 256色データには対応していません。 画面比率デー
                   タにも対応していません。

                例: 画像を読み込んで表示する(98用)

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
#include "master.h"
int main(void) {
    char piname[] = "test.pi";
    PiHeader piheader;
    void far * buf;
    char far * ptr;
    int y;
    int s = graph_pi_load_pack( piname, &piheader, &buf );
    if ( s == NoError ) {
        if ( piheader.commentlen ) {
            if ( graph_pi_comment_load( piname, &piheader ) == NoError ) {
                dos_puts( "コメント : " );
                dos_write(1, piheader.comment, piheader.commentlen );
                dos_puts( CRLF );
            } else {
                dos_puts( "コメントが変?"CRLF );
            }
        }
        graph_start();
        palette_set_all( &piheader.palette );
        palette_show();
        ptr = buf;
        for ( y = 0; y < piheader.ysize; ++y ) {
            graph_pack_put_8( 0, y, ptr, piheader.xsize );
            ptr += piheader.xsize / 2;
            ptr = FP_REGULAR(ptr);
        }
        graph_pi_free( &piheader, buf );
    } else if ( s == InsufficientMemory ) {
        dos_puts( "メモリが足りないの"CRLF );
    } else if ( s == InvalidData ) {
        dos_puts( "ファイルが 16色Piじゃありませんね"CRLF );
    } else if ( s == FileNotFound ) {
        dos_puts( "ファイルがみつかりません"CRLF );
    }
    return 0;
}
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

                △MEMORY: 画像データ、 機種依存データに必要なメモ
                  リブロックを確保します。
                          また作業中、一時的に 17KB  のバッファを
                          確保します。

                ○ 参照:  graph_pack_put_8(),
                          graph_pi_comment_load(),
                          graph_pi_free(),  graph_pi_load_pack(),
                          mag_free(), mag_load_pack(),
                          vga4_pack_put_8()

------------------------------------------------------------------------
□ graph_plasma - 画面のドットずれ補正

C:      void graph_plasma(void);                           マクロ

        ------------------------------------------98N 98H AT DOS-
        graph_plasma                               V  × ×
        -----------------------------------------------------<->-

                ● I/Oポートを直接アクセスして、 グラフィック画面
                   とテキスト画面の表示位置を一致させます。

                ○ システム起動時は 1ドットずれていますが、現在の
                   状態を知ることができないし、普段一致させている
                   人もいるので、ドットずれ補正した後にわざわざず
                   らす必要はないでしょう。
                ○ 98はプラズマディスプレイのときにドットずれがな
                   い状態で起動するので、この名前になっています。

------------------------------------------------------------------------
□ graph_readdot, vga4_readdot - グラフィック画面の任意の地点の色を得る

C:      int graph_readdot( int x, int y );
C:      int vga4_readdot(int x,int y);

        ------------------------------------------98N 98H AT DOS-
        graph_readdot                              ○  × *
        -------------------------------------------
        vga4_readdot                               ×  × ○
        -------------------------------------------

                ● 指定座標の色コードを得ます。

                ← x,y  読み取る座標

                → 0~15  読み取った色
                   -1     座標が範囲外

                ★ <98>8色の機械では、8~15が返ります。

------------------------------------------------------------------------
□ graph_restore - EMSに退避したグラフィック画面の復元

C:      int graph_restore(void);

        ------------------------------------------98N 98H AT DOS-
        graph_restore                              ○  × ×
        -------------------------------------------

                ● graph_backupによって退避したグラフィック画面を
                   復元し、その保持に使ったEMSメモリを開放します。

                → 1  成功
                   0  失敗(まだ退避してないなど)

------------------------------------------------------------------------
□ graph_setextmode - 9821拡張グラフィックモードの設定

C:      void graph_setextmode(unsigned v);                 マクロ

        ------------------------------------------98N 98H AT DOS-
        graph_setextmode                           ○  × ×
        -----------------------------------------------------<->-

                ● 現在の9821/A/C拡張モードを設定します。

                ← v  上位8bit:  BHの値
                      下位8bit:  ALの値

                ○ ビット内容については graph_extmode 参照
                ○ 9821/A/Cでなければ何もしません。

------------------------------------------------------------------------
□ graph_show - グラフィック画面を表示する

C:      void graph_show(void);

        ------------------------------------------98N 98H AT DOS-
        graph_show                                 ○  × ×
        --------------------------------------------

                ● BIOSを用いてグラフィック画面を表示します。

------------------------------------------------------------------------
□ graph_shown - グラフィック画面の表示状態を得る

C:      int graph_shown(void);

        ------------------------------------------98N 98H AT DOS-
        graph_shown                                ○  × ×
        -------------------------------------------

                ● グラフィック画面が現在表示されているかどうかを
                   得ます。

                → 1 表示
                   0 非表示

------------------------------------------------------------------------
□ graph_showpage, at98_showpage - グラフィック画面表示ページ設定

C:      void graph_showpage( int page );                   マクロ
C:      void at98_showpage( int page );

        ------------------------------------------98N 98H AT DOS-
        graph_showpage                             ○  × *
        -----------------------------------------------------<->-
        at98_showpage                              ×  × ○
        -------------------------------------------

                ● 表示ページを指定します。
                   pageには、0 または 1 が指定できます。

                ○  graph_400line()などによって、640x400(以下)
                   になっている場合専用です。ハードウェアスクロー
                   ルによって、page切り替えをエミュレーションしま
                   す。この際、 at98_scroll()によるスクロール設定
                   を継承します。 また、VSYNC外に呼び出されると内
                   部でVSYNC内になるまで待ってから作業しているの
                   でかなり時間がかかります。

------------------------------------------------------------------------
□ graph_scroll, at98_scroll -  グラフィック画面をハードウェアスクロール
   する

C:      void graph_scroll( unsigned line1, unsigned adr1, unsigned adr2 );
C:      void at98_scroll( unsigned line1, unsigned adr1 );

        ------------------------------------------98N 98H AT DOS-
        graph_scroll                               ○  × *
        -------------------------------------------
        at98_scroll                                ×  × ○
        -------------------------------------------

                ● GDCの機能である画面分割機能を利用して、 グラフ
                   ィック画面をスクロールさせます。グラフィック画
                   面は2分割できるため、一つの画面上で二つの領域
                   を別々にスクロールさせることができます。横方向
                   は  16ドットで 1つアドレスがずれるため、16ドッ
                   ト単位でのみスクロールさせることができます。

                ← line1  第一領域のline数 ( 0 ~ graph_VramLines
                          )
                   adr1   第一領域の先頭アドレス(ワード単位。すな
                          わち実際のoffset addresを2で割った値)
                   adr2   <98>下部分の先頭 GDC オフセットアドレス

                ★ graph_400line や graph_200line などの、
                   graph_VramZoom  変数を設定する処理をあらかじめ
                   実行しておく必要があります。

                ★ 98と違い、第二領域のアドレスが設定できませ
                   ん。このため、縦スクロールと横スクロールはでき
                   ますが、縦横同時にずらすと画面がずれます。
                ★ 内部でVSYNCを待っています。このため、VSYNC
                   内に入ったタイミングで呼び出されると高速ですが、
                   そうでないときに呼び出されると低速です。

                ○ 縦スクロールは、上画面のアドレスを
                   (graph_VramLines-ライン数)*40に設定し、 下画面
                   の先頭を 0 にすることで行えます。

------------------------------------------------------------------------
□ graph_scrollup - グラフィック画面をハードウェア縦スクロールする

C:      void graph_scrollup( unsigned line1 );

        ------------------------------------------98N 98H AT DOS-
        graph_scrollup                             ○  × *
        -------------------------------------------

                ● GDCの機能である画面分割機能を利用して、 グラフ
                   ィック画面を縦にスクロールさせます。

                ← line   正常時に対して上にずらすライン数 ( 0 ~
                          graph_VramLines-1 )

                ★ graph_400line や graph_200line などの、
                   graph_VramZoom  を設定する処理をあらかじめ実行
                   しておく必要があります。

------------------------------------------------------------------------
□ graph_start, vga4_start - 16色グラフィック画面一括初期設定

C:      void graph_start(void);
C:      int vga4_start(int videomode, int xdots, int ydots);

        ------------------------------------------98N 98H AT DOS-
        graph_start                                V  × *
        -------------------------------------------
        vga4_start                                 ×  × ○
        -------------------------------------------

                ● <98>開始のために、以下の処理を行います。
                   graph_plasma
                   palette_init
                   graph_showpage(0)
                   graph_accesspage(0)
                   graph_400line
                   graph_clear
                   graph_show

                   現在のビデオモードを記録し、ビデオモードを
                   変更、グラフィック画面描画に関する変数を設定し、
                   grc_setclip, dac_initを呼び出します。

                → 1  成功
                   0  ビデオモード変更に失敗

                ○ 現在までのビデオモードを内部に記録します。
                ○ ビデオモード変更に成功した場合、設定する変
                   数などは以下の通りです。
                   graph_VramSeg   0xa000
                   graph_VramWidth xdots/8         横一列のバイト
                                                   数
                   graph_VramWords xdots*ydots/16  全体のワード数
                   graph_VramLines ydots           縦ドット数
                   graph_VramZoom  0または1        ビデオモード
                                                   0x0e(640x200)
                                                   に指定した場合
                                                   のみ、 1になり
                                                   ます。
                   grc_setclip(0,0,xdots-1,ydots-1)
                   VTextState      0x8000をOR      グラフィックモ
                                                   ード

                例:
                   ・通常の640x480x16colorの場合
                       vga4_start(0x12,640,480);
                   ・VESAの800x600x16colorの場合
                       vga4_start(0x6a,800,600);
                   ・640x200x16colorにしたい場合
                       vga4_start(0x0e,640,200);
                   ・全画面の640x400x16colorにしたい場合
                       vga4_start(0x0e,640,400),vga_vzoom_off();

                ○ 参照:  graph_end(), graph_enter(),
                          graph_leave(), vgc_start()

------------------------------------------------------------------------
□ graph_unpack_get_8, vga4_unpack_get_8 - バイト単位データ読み取り(8dot
   単位)

C:      void graph_unpack_get_8( int x, int y,
                                void far * linepat, int len );
C:      void vga4_unpack_get_8( int x, int y, void far * linepat, int len );

        ------------------------------------------98N 98H AT DOS-
        graph_unpack_get_8                         V  × *
        -------------------------------------------
        vga4_unpack_get_8                          ×  × ○
        -------------------------------------------

                ● グラフィック画面の16色データを1バイト1色形式
                   にして読み込みます。

                ← x        左端座標( 8の倍数に切り捨てます )
                   y        描画 y 座標
                   linepat  色データを格納する先頭アドレス
                             ★lenバイトの領域を用意してください。
                   len      横ドット数( 8の倍数に切り捨てられます
                            )

                ★ クリッピングは上下は grc_setclip範囲、左右は画
                   面幅で行っています。
                   クリッピング範囲外の領域は読み込みません。

------------------------------------------------------------------------
□ graph_unpack_large_put_8 - バイト単位4倍角データ描画(8dot単位)

C:      void graph_unpack_large_put_8( int x, int y,
                                      const void far * linepat, int len );

        ------------------------------------------98N 98H AT DOS-
        graph_unpack_large_put_8                   V  × ×
        -------------------------------------------

                ● グラフィック画面に、1バイト1色形式のデータを
                   4倍角(縦横2倍)で書き込みます。

                ← x        左端座標( 8の倍数に切り捨てます )
                   y        描画 y 座標
                   linepat  色データの先頭アドレス
                   len      横ドット数( 8の倍数に切り捨てられます
                            )

                ★ クリッピングは上下は grc_setclip範囲、左右は画
                   面幅で行っています。

------------------------------------------------------------------------
□ graph_unpack_put_8, vga4_unpack_put_8 - バイト単位データ描画(8dot単位)

C:      void graph_unpack_put_8( int x, int y,
                                const void far * linepat, int len );
C:      void vga4_unpack_put_8( int x, int y,
                               const void far * linepat, int len );

        ------------------------------------------98N 98H AT DOS-
        graph_unpack_put_8                         V  × *
        -------------------------------------------
        vga4_unpack_put_8                          ×  × ○
        -------------------------------------------

                ● グラフィック画面に、1バイト1色形式のデータを
                   書き込みます。

                ← x        左端座標( 8の倍数に切り捨てます )
                   y        描画 y 座標
                   linepat  色データの先頭アドレス
                   len      横ドット数( 8の倍数に切り捨てられます
                            )

                ★ クリッピングは上下は grc_setclip範囲、左右は画
                   面幅で行っています。

------------------------------------------------------------------------
□ graph_wank_putc - 圧縮半角文字描画

C:      void graph_wank_putc( int x, int y, int c );

        ------------------------------------------98N 98H AT DOS-
        graph_wank_putc                            V  × ×
        -------------------------------------------

                ● グラフィック画面に8x8ドットの半角文字を描画し
                   ます。

                ← x,y    左上座標
                   c      文字

                ★ クリッピングは行っていません。
                ★ あらかじめ  wfont_entry_bfnt()による圧縮フォン
                   トの登録が必要です。

------------------------------------------------------------------------
□ graph_wank_putca - 圧縮半角文字描画(色指定)

C:      void graph_wank_putca( int x, int y, int ch, int color );

        ------------------------------------------98N 98H AT DOS-
        graph_wank_putca                           V  × ×
        -------------------------------------------

                ● グラフィック画面に 8x8  ドットの半角文字を指定
                   した色で描画します。

                ← x,y    左上座標
                   ch     文字コード ( 0~255 )
                   color  色( 0~15 )

                ★ クリッピングは行っていません。
                ★ あらかじめ  wfont_entry_bfnt()による圧縮フォン
                   トの登録が必要です。

------------------------------------------------------------------------
□ graph_wank_puts - 圧縮半角文字列描画

C:      void graph_wank_puts( int x, int y, int step, const char * str );

        ------------------------------------------98N 98H AT DOS-
        graph_wank_puts                            V  × ×
        -------------------------------------------

                ● グラフィック画面に8x8ドットの半角文字で文字列
                   を描画します。

                ← x,y    左上座標
                   step   文字間隔(8でぴったり連続します)
                   str    文字列の先頭アドレス

                ★ クリッピングは行っていません。
                ★ あらかじめ  wfont_entry_bfnt()による圧縮フォン
                   トの登録が必要です。

------------------------------------------------------------------------
□ graph_wank_putsa - 圧縮半角文字列描画(色指定)

C:      void graph_wank_putsa( int x, int y, int step,
                              const char * str, int color );

        ------------------------------------------98N 98H AT DOS-
        graph_wank_putsa                           V  × ×
        -------------------------------------------

                ● グラフィック画面に 8x8  ドットの半角文字列を指
                   定した色で描画します。

                ← x,y    左上座標
                   step   文字間隔(8でぴったり連続します)
                   str    文字列の先頭アドレス
                   color  色( 0~15 )

                ★ クリッピングは行っていません。
                ★ あらかじめ  wfont_entry_bfnt()による圧縮フォン
                   トの登録が必要です。

------------------------------------------------------------------------
□ graph_wfont_plane - 圧縮半角文字描画のプレーン設定

C:      void graph_wfont_plane( int a, int b, int c )      マクロ

        ------------------------------------------98N 98H AT DOS-
        graph_wfont_plane                          V  × ×
        -----------------------------------------------------<->-

                ● 圧縮文字描画を行うプレーンを設定します。

                ← a   漢字フォント内の偶数ライン描画を行うプレー
                       ン
                   b   漢字フォント内の奇数ライン描画を行うプレー
                       ン
                        a,bは、共に以下の中から指定します。
                        (GC_RMW|GC_B)   セグメント 0a800h に描画
                        (GC_RMW|GC_R)   セグメント 0b000h に描画
                        (GC_RMW|GC_G)   セグメント 0b800h に描画
                        (GC_RMW|GC_I)   セグメント 0e000h に描画
                   c   GRCGのタイルレジスタの値指定。 4プレーンす
                       べてのこの値でうめられます。  デフォルトは
                       0ffh、すなわちすべてのビットONですが、この
                       値を0にすると、すべてのビットを0にすること
                       ができます。(黒い文字を書くときなどのため)

                ○ wfont_Plane1, wfont_Plane2,  wfont_Reg変数に代
                   入しているだけです。

------------------------------------------------------------------------
□ graph_wfont_put - 圧縮1文字描画

C:      void graph_wfont_put( int x, int y, const char * str );

        ------------------------------------------98N 98H AT DOS-
        graph_wfont_put                            V  × ×
        -------------------------------------------

                ● グラフィック画面に、 文字列の最初の1文字を描画
                   します。
                   全角・半角のどちらも描画できます。

                ← x,y    左上座標
                   str    文字列の先頭アドレス

                ★ クリッピングは行っていません。
                ★ あらかじめ  wfont_entry_bfnt()による圧縮フォン
                   トの登録が必要です。

------------------------------------------------------------------------
□ graph_wfont_puts - 圧縮文字列描画

C:      void graph_wfont_puts( int x, int y, int step, const char * str );

        ------------------------------------------98N 98H AT DOS-
        graph_wfont_puts                           V  × ×
        -------------------------------------------

                ● グラフィック画面へ圧縮文字列を描画します。

                ← x,y    左上座標
                   step   文字間隔(全角文字の幅を基準にするので、
                          16でぴったり連続します。 半角文字はこの
                          指定の半分(端数切り捨て)だけ進みます)
                   str    文字列の先頭アドレス

                ★ 漢字半角には対応していません。
                ★ クリッピングは行っていません。
                ★ あらかじめ  wfont_entry_bfnt()による圧縮フォン
                   トの登録が必要です。

------------------------------------------------------------------------
□ graph_wkanji_put - 圧縮全角文字描画

C:      void graph_wkanji_put( int x, int y, const char * str );

        ------------------------------------------98N 98H AT DOS-
        graph_wkanji_put                           V  × ×
        -------------------------------------------

                ● グラフィック画面へ圧縮全角文字を描画します。

                ← x,y    左上座標
                   str    文字列の先頭アドレス。この1文字目が描画
                          されます。

                ★ 漢字半角には対応していません。
                ★ クリッピングは行っていません。
                ★ あらかじめ  wfont_entry_bfnt()による圧縮フォン
                   トの登録が必要です。

------------------------------------------------------------------------
□ graph_wkanji_puts - 圧縮全角文字列描画

C:      void graph_wkanji_puts( int x, int y, int step, const char * str );

        ------------------------------------------98N 98H AT DOS-
        graph_wkanji_puts                          V  × ×
        -------------------------------------------

                graph_kanji_puts
                ● グラフィック画面に、全角文字のみで構成された文
                   字列を圧縮して描画します。

                ← x,y    左上座標
                   step   文字間隔(16でぴったり連続します)
                   str    文字列の先頭アドレス

                ★ 漢字半角には対応していません。
                ★ クリッピングは行っていません。
                ★ あらかじめ  wfont_entry_bfnt()による圧縮フォン
                   トの登録が必要です。

------------------------------------------------------------------------
□ graph_xlat_dot - グラフィック画面の点の色を置き換える

C:      void graph_xlat_dot( int x, int y, char * trans );

        ------------------------------------------98N 98H AT DOS-
        graph_xlat_dot                             ○  × *
        -------------------------------------------

                ● 任意の地点の色番号を、 配列transの添え字として
                   その内容の色に置き換えます。
                   transは 0~15の 16要素が必要で、値は下位  4bit
                   のみが有効です。

                ★ 画面の大きさを 640x400ドットとしてクリッピング
                   しています。

------------------------------------------------------------------------
□ graph_xorboxfill - XOR矩形塗り潰し

C:      void graph_xorboxfill( int x1,int y1, int x2,int y2, int color );

        ------------------------------------------98N 98H AT DOS-
        graph_xorboxfill                           V  × *
        -------------------------------------------

                ● グラフィック画面の長方形領域に対して、指定色で
                   xor をかけます。

                ← x1,y1  頂点1
                   x2,y2  頂点2
                   color  xorする値(0~15)

                ★ クリッピングは、現在の画面全体で行っています。

                ○ VGAには vgc_setcolorに VGA_XOR  を指定すること
                   で XOR描画ができますが、98では XOR指定ができな
                   いため、単独で用意しました。

------------------------------------------------------------------------
□ mag_free - MAG画像をメモリから開放

C:      void mag_free( MagHeader * header, void far * image );

        ------------------------------------------98N 98H AT DOS-
        mag_free
        --------------------------------------------

                ● 読み込んだMag画像のヘッダから comment を開放し、
                   image(画像データ)も開放します。

                ← header   MAGヘッダ
                   image    mag_load_packでbufptrに返されたアドレ
                            ス

                ○ 開放すると、headerの中の以下のメンバデータは 0
                   に初期化されます。
                    commentseg, commentlen

                ○ 画像データだけを先に単独で開放した場合
                   ( hmem_free(FP_SEG(image))  )、 この関数の引数
                   image  にはそのアドレスは渡さずに、NULL を渡し
                   て下さい。

                ★ mag_load_packによってメモリに読み込んだ画像が
                   不要になったら、必ずこの関数で開放してください。

                ○ 参照:  graph_pack_put_8(),
                          graph_pi_comment_load(),
                          graph_pi_free(),  graph_pi_load_pack(),
                          mag_free(), mag_load_pack(),
                          vga4_pack_put_8()

------------------------------------------------------------------------
□ mag_load_pack - 16色MAG画像fileのメモリへの読み込み

C:      int mag_load_pack( const char * filename,
                          MagHeader * header, void far ** bufptr );

        ------------------------------------------98N 98H AT DOS-
        mag_load_pack                                        ○
        -------------------------------------------

                ● 16色 MAG形式ファイルの画像データ及びヘッダ情報、
                   コメントを読み込みます。

                ← filename  MAG画像ファイル名
                   header    ヘッダ情報格納場所
                   bufptr    画像データの先頭アドレスの格納先

                → NoError             読み込み成功(bufptrにアド
                                       レスを格納した)
                   FileNotFound        ファイルが見つからない
                   InvalidData         16色MAGファイルではない
                   InsufficientMemory  メモリ不足

                ○ W.Rinn氏の作成した画像フォーマット MAG (MAKI02)
                   形式のファイルを読み込みます。
                ○ 画像データは、MAG フォーマット自体の都合により、
                   横座標が 8dot単位で格納されています。このため、
                   データが部分セーブされたものである場合、
                   (header.x1 and not 7)から(header.x2 or  7)まで
                   入っています。左側 (header.x1 and 7)ドットと、
                   右側(7  - (header.x2 and 7))ドットは、表示しな
                   いことになっていますが…(笑)。
                ○ コメントは、header.commentseg のセグメントのオ
                   フセット0のアドレスから、header.commentlenバイ
                   ト格納されています。
                ○ 読み込んだ画像データの表示は、
                   graph_pack_put_8() を用いて header.xsize / 2バ
                   イトずつ進めながら 1line分ずつ表示してください。
                ○ 読み込んだ画像データの開放には、
                   hmem_free(FP_SEG(bufptr));を実行してください。
                ○ パレットデータは、headerに入っています。表示す
                   るには、palette_set_all( header.palette ) を実
                   行してください。

                ○ 画像のために確保されるメモリは、(xsize/2*ysize)
                   バイトです。

                ★ 256色データには対応していません。

                例: 画像を読み込んで表示する(98用)

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
#include "master.h"
int main(void) {
    char magname[] = "test.mag";
    MagHeader mag;
    void far * buf;
    char far * ptr;
    int y;
    int s = mag_load_pack( magname, &mag, &buf );
    if ( s == NoError ) {
        if ( mag.commentlen ) {
            dos_puts( "コメント : " );
            dos_write(1, SEG2FP(mag.commentseg), mag.commentlen );
            dos_puts( CRLF );
        }
        graph_start();
        palette_set_all( &mag.palette );
        palette_show();
        ptr = buf;
        for ( y = mag.y1 ; y <= mag.y2 ; ++y ) {
            graph_pack_put_8( mag.x1 & ~7, y, ptr, mag.xsize );
            ptr = FPADD(ptr, mag.xsize/2);
        }
        mag_free( &mag, buf );
    } else if ( s == InsufficientMemory ) {
        dos_puts( "メモリが足りないの"CRLF );
    } else if ( s == InvalidData ) {
        dos_puts( "ファイルが 16色magじゃありませんね"CRLF );
    } else if ( s == FileNotFound ) {
        dos_puts( "ファイルがみつかりません"CRLF );
    }
    return 0;
}
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

                △MEMORY:  画像データに必要なメモリブロックを確保
                  します。
                          また作業中、一時的に 17KB  のバッファを
                          確保します。

                ○ 参照:  graph_pack_put_8(),
                          graph_pi_comment_load(),
                          graph_pi_free(),  graph_pi_load_pack(),
                          mag_free(), mag_load_pack(),
                          vga4_pack_put_8()

------------------------------------------------------------------------
□ vga4_bfnt_putc - BFNT文字描画(上書き)

C:      void vga4_bfnt_putc( int x, int y, int c, int color );

        ------------------------------------------98N 98H AT DOS-
        vga4_bfnt_putc                             ×  × ○
        -------------------------------------------

                ● ANK文字を描画します。文字の背景も塗り潰します。

                ← x,y    描画開始左上座標
                   c      半角文字
                   color  背景色*16+文字色(色は0~15)

                ○ 横8dot単位の境界線に従って背景は塗り潰されます。
                ★ フォントデータはあらかじめ   font_entry_bfnt()
                   などで登録しておいてください。
                ★ 文字が重なると結果はくずれる場合があります。

------------------------------------------------------------------------
□ vga4_bfnt_puts - BFNT文字列描画(上書き)

C:      void vga4_bfnt_puts( int x, int y, int step,
                            const char * anks, int color );

        ------------------------------------------98N 98H AT DOS-
        vga4_bfnt_puts                             ×  × ○
        -------------------------------------------

                ● ANK文字列を描画します。 文字の背景も塗り潰しま
                   す。

                ← x,y    描画開始左上座標
                   step   文字ごとに進めるドット数(0=進めない)
                   anks   ANK文字列
                   color  背景色*16+文字色(色は0~15)

                ○ 横8dot単位の境界線に従って背景は塗り潰されます。

                ★ フォントデータはあらかじめ   font_entry_bfnt()
                   などで登録しておいてください。
                ★ 文字が重なると結果はくずれる場合があります。

------------------------------------------------------------------------
□ vga4_byte_move - 矩形部分の転送(横8dot単位)

C:      void vga4_byte_move(  int  x1,int  y1,  int  x2,int   y2,
                            int tox,int toy );

        ------------------------------------------98N 98H AT DOS-
        vga4_byte_move                             ×  × ○
        -------------------------------------------

                ● VRAMの長方形領域を他の座標に転送します。座標範
                   囲の検査や、重なりは考慮していませんので注意し
                   てください。

                ← x1,y1    転送元の第1頂点
                   x2,y2    転送元の第2頂点
                   tox,toy  第1頂点の転送先

------------------------------------------------------------------------
□ vga_dc_modify - VGAレジスタのビット操作

C:      void vga_dc_modify( int num, int andval, int orval );

        ------------------------------------------98N 98H AT DOS-
        vga_dc_modify                              ×  × ○
        -------------------------------------------

                ● VGAのレジスタのビットをand, or操作します。

                ← num     レジスタインデックス(port 3d4h)
                   andval  ANDする値
                   orval   ORする値
                   値は下位8bitのみ有効です。

                ○ 詳しくは、 VGAのディスプレイコントローラに関す
                   る資料を入手してください。

------------------------------------------------------------------------
□ vga_setline - 表示ライン数の設定

C:      void vga_setline( unsigned lines );

        ------------------------------------------98N 98H AT DOS-
        vga_setline                                ×  × ○
        -------------------------------------------

                ● VGAの表示ライン数を変更します。

                ← lines  表示ライン数(1~819, 普段は 480)

                ○ このライン数を変更すると、画面は上からそのライ
                   ン数だけ表示されます。
                ○ そのライン数が画面全体に広がるのではなく、その
                   ライン数以下は表示をマスクしているだけです。

------------------------------------------------------------------------
□ vga_startaddress - 表示開始アドレスの設定

C:      void vga_startaddress( unsigned address );

        ------------------------------------------98N 98H AT DOS-
        vga_startaddress                           ×  × ○
        -------------------------------------------

                ● 画面の表示開始アドレスを指定します。

                ← address  画面左上隅にする VRAMのオフセットアド
                            レス(普段は0)

                ○ mode 12hだと、 819lineぶんあるグラフィック画面
                   の 480lineしか表示されていません。ここで、この
                   アドレスを変更すると、 819lineの中であれば自由
                   にスクロールすることができることになります。

                ○ たとえば vga_setline(400)を実行し、
                   vga_startaddress( 0 ) と
                   vga_startaddress( 0x8000 ) を切り替えて2pageあ
                   ることにすれば、98用のVRAM直接アクセス型プログ
                   ラムからの移植を助けることもできます。(VRAM
                   segmentは page 0=0xa000, page 1=0xa800になりま
                   す)

------------------------------------------------------------------------
□ vga_vzoom_off - 縦2倍拡大モードOFF

C:      void vga_vzoom_off(void);                          マクロ

        ------------------------------------------98N 98H AT DOS-
        vga_vzoom_off                              ×  × ○
        -----------------------------------------------------<->-

                ● vga_vzoom_on による縦倍状態を解除します。

                ○ 実行後、graph_VramZoom 変数は 0 に設定されます。

------------------------------------------------------------------------
□ vga_vzoom_on - 縦2倍拡大モードON

C:      void vga_vzoom_on(void);                           マクロ

        ------------------------------------------98N 98H AT DOS-
        vga_vzoom_on                               ×  × ○
        -----------------------------------------------------<->-

                ● グラフィック16色モード時、 1ドットの縦の大きさ
                   を倍にします。これにより、640x200や、800x300と
                   いった画面解像度にすることができます。

                ○ 実行後、graph_VramZoom 変数は 1 に設定されます。

                ★ ビデオカードによってはうまく動作しないかもしれ
                   ません。

------------------------------------------------------------------------
□ vgc_kanji_putc - 全角文字の描画

C:      void vgc_kanji_putc(int x, int y, unsigned kanji );

        ------------------------------------------98N 98H AT DOS-
        vgc_kanji_putc                             ×  × ○
        -------------------------------------------

                ● 全角文字(16x16dot)をグラフィック画面に描画しま
                   す。

                ← x,y   描画開始左上座標
                   ank   全角文字コード(shift-JISのみ)

                ○ 色は、vgc_setcolor で指定します。
                ○ 日本語テキストモード以外で処理するためには、日
                   本語テキストモードのうちにfont_at_init()を実行
                   しておく必要があります。

                ★ クリッピングは行っていません。

------------------------------------------------------------------------
□ vgc_kanji_puts - 全角文字列の描画

C:      void vgc_kanji_puts( int x, int y, int step, const char * kanji );

        ------------------------------------------98N 98H AT DOS-
        vgc_kanji_puts                             ×  × ○
        -------------------------------------------

                ● 全角文字列をグラフィック画面に描画します。

                ← x,y   描画開始左上座標
                   step  1文字ごとに右に進めるドット数(0だとすべ
                         て同じ位置に描画)
                   kanji 全角文字のみから構成する文字列

                ○ 色は、vgc_setcolor で指定します。
                ○ 日本語テキストモード以外で処理するためには、日
                   本語テキストモードのうちにfont_at_init()を実行
                   しておく必要があります。
                ★ フォントデータはあらかじめ   font_entry_bfnt()
                   などで登録しておいてください。

                ★ クリッピングは行っていません。

------------------------------------------------------------------------
□ vgc_start - 640x480dot 16色グラフィック設定

C:      void vgc_start(void);                              マクロ

        ------------------------------------------98N 98H AT DOS-
        vgc_start                                  ×  × V
        -----------------------------------------------------<->-

                ● VGAを 640x480dot, 16色グラフィックとして初期化
                   します。

                ○ 具体的には、vga4_start(0x12,640,480)を実行しま
                   す。

                ○ 参照:  graph_end(), graph_enter(),
                          graph_leave(), vga4_start()


------------------------------------------------------------------------
■ アナログ16色パレット制御 ■■■■■■■■■■■■■■■■■■■■■■

         16色グラフィック画面では、98だと4096色、VGAだと26万色の
        中から、同時には16個を選んで表示できます。
         ここで説明する関数は、その内容をすべて配列変数に保存し、
        この値を書き換え、 表示関数(palette_show)を呼び出すことで
        実際に反映させる形態をとっています。
         また、 実際のハードウェアに装備されているパレットと異な
        り、全体の明るさを別に指定できます(PaletteTone変数)。
         実際にこれらの関数を実行する場合は、最初に palette_init
        を実行するようにしてください。

------------------------------------------------------------------------
□ 構造体/グローバル変数

unsigned PaletteTone;            パレットの明るさ
                                 0(黒)~100(純色)~200(白)
const char PalettesInit[16][3];  パレットの初期値(N88BASIC(86)風)
unsigned char Palettes[16][3];   パレットの現在の値。
                                 palette_init()を実行する前は真っ
                                 黒になっています。
                                 並びは r,g,bの順で、 各値は  0~
                                 255 です。
int PaletteNote;                 液晶8階調モードフラグ
                                 0=CRT
                                 1=<98>液晶8階調, 色反転

------------------------------------------------------------------------
□ palette_100, dac_100 - 明るさを100%にする

C:      void palette_100(void);                            マクロ
C:      void dac_100(void);                                マクロ

        ------------------------------------------98N 98H AT DOS-
        palette_100                                V     *
        dac_100                                    ×  × ○
        -----------------------------------------------------<->-

                ● パレットの明るさを 100%にします。

------------------------------------------------------------------------
□ palette_black, dac_black - 画面を真っ黒にする

C:      void palette_black(void);                          マクロ
C:      void dac_black(void);                              マクロ

        ------------------------------------------98N 98H AT DOS-
        palette_black                              V     *
        dac_black                                  ×  × ○
        -----------------------------------------------------<->-

                ● パレットの明るさを  0%にすることで画面を真っ黒
                   にします。あとで100%に戻さないと、いつまでたっ
                   ても真っ黒です。

------------------------------------------------------------------------
□ palette_black_in, dac_black_in - 画面を黒からフェードインする

C:      void palette_black_in( unsigned speed );
C:      void dac_black_in( unsigned speed );

        ------------------------------------------98N 98H AT DOS-
        palette_black_in                           V     *
        --------------------------------------------
        dac_black_in                               ×  × ○
        --------------------------------------------

                ● 最初にパレットのトーンを 0(黒)に設定し、徐々に
                   100(本来の色)へと変化させます。

                ← speed 変化させる速さ
                         0 が最速で、1  以上にするとパレットを  1
                         段階変化させるのに speed 回の VSYNC を待
                         ちます。  つまり、 speed * 16 回の VSYNC
                         だけの時間を消費します。

                ○ 内部で  palette_show  と  vsync_wait,   または
                   dac_show と vga_vsync_wait を呼んでいます。
                ★ 実行後、トーンは 100%になります。

------------------------------------------------------------------------
□ palette_black_out, dac_black_out - 画面を黒にフェードアウトする

C:      void palette_black_out( unsigned speed );
C:      void dac_black_out( unsigned speed );

        ------------------------------------------98N 98H AT DOS-
        palette_black_out                          V     *
        -------------------------------------------
        dac_black_out                              ×  × ○
        -------------------------------------------

                ● 最初にパレットのトーンを 100(本来の色)に設定し、
                   徐々に 0(黒)へと変化させます。変化させる速さは
                   speed で指定します。

                ← speed 変化させる速さ
                         0 が最速で、1  以上にするとパレットを  1
                         段階変化させるのに speed 回の VSYNC を待
                         ちます。  つまり、 speed * 16 回の VSYNC
                         だけの時間を消費します。

                ○ 内部で  palette_show  と  vsync_wait,   または
                   dac_show と vga_vsync_wait を呼んでいます。

                ★ 実行後、トーンは 0%になります。このため、 この
                   後トーンを再設定しない限りパレットをどんな値に
                   設定しても画面は黒いままになるので注意が必要で
                   す。

------------------------------------------------------------------------
□ palette_entry_rgb - RGBファイルを読み込む

C:      int palette_entry_rgb( const char * filename );

        ------------------------------------------98N 98H AT DOS-
        palette_entry_rgb                                    ○
        --------------------------------------------

                ● RGBファイルを読み込んで、グローバル変数
                   Palettesに設定します。

                ← RGBファイル名

                → NoError      成功
                   FileNotFound 指定された RGB ファイルがオープン
                   できない

                ★ 表示するためには  palette_show()を使用してくだ
                   さい。

                ★ RGBファイルは、以下のような仕様を要求します。
                     ・拡張子 .RGB で、48バイトのファイル
                       内容は、3バイトで1色を表し、16個並ぶ。
                       1色は、Red, Green, Blue  の各要素を  0~15
                       (0h~0fh)で表す。

------------------------------------------------------------------------
□ palette_init, dac_init - パレット変数の初期化

C:      void palette_init(void);
C:      void dac_init(void);

        ------------------------------------------98N 98H AT DOS-
        palette_init                               V     *
        --------------------------------------------
        dac_init                                   ×  × ○
        --------------------------------------------

                ● アナログパレットを使用する準備をします。
                   <98>   Palettes に、PalettesInit  の内容を複写
                          し、graph_analog()を実行し、PaletteTone
                          を  100にした後、palette_show()を実行し
                          ます。
                      Palettesに PalettesInit の内容を設定し、
                          トーンを100%にし、dac_showを実行します。
                          また、パレットコード16を黒にし、 ボーダ
                          ーカラーを16にします。

------------------------------------------------------------------------
□ palette_set - パレットを一つ設定する

C:      void palette_set( int num, int r, int g, int b );  マクロ

        ------------------------------------------98N 98H AT DOS-
        palette_set
        -----------------------------------------------------<->-

                ● パレットに値を一つ設定します。表示は
                   palette_showを使用してください。

------------------------------------------------------------------------
□ palette_set_all - パレットを全部設定する(256階調)

C:      void palette_set_all( char pal[48] );              マクロ

        ------------------------------------------98N 98H AT DOS-
        palette_set_all
        -----------------------------------------------------<->-

                ● パレットに16色すべての情報を設定します。表示は
                   palette_showを使用してください。

                ← pal  パレット16個(R,G,B各値の最大値が  255であ
                        るデータ)

------------------------------------------------------------------------
□ palette_set_all_16 - パレットを全部設定する(16階調)

C:      void palette_set_all_16( char pal[48] );

        ------------------------------------------98N 98H AT DOS-
        palette_set_all_16
        -------------------------------------------

                ● パレットに16色すべての情報を設定します。表示は
                   palette_showを使用してください。

                ← pal  パレット16個(R,G,B各値の最大値が 15である
                        データ)

------------------------------------------------------------------------
□ palette_settone, dac_settone - パレットの明るさを設定する

C:      void palette_settone( int tone );                  マクロ
C:      void dac_settone( int tone );                      マクロ

        ------------------------------------------98N 98H AT DOS-
        palette_settone                            V     *
        dac_settone                                ×  × ○
        -----------------------------------------------------<->-

                ● PaletteToneに値を設定し、画面に反映します。

------------------------------------------------------------------------
□ palette_show, dac_show - パレット変数の画面への反映

C:      void palette_show(void);
C:      void dac_show(void);

        ------------------------------------------98N 98H AT DOS-
        palette_show                               V     *
        --------------------------------------------
        dac_show                                   ×  × ○
        --------------------------------------------

                ● Palettes,PaletteToneの内容に従って、パレットの
                   ハードウェアに色を設定します。
                   PaletteNote が 1ならば次のように補正します。

                ○ <98> PaletteNote が 1  ならば液晶8階調用に補正
                   して初期化します。液晶8階調補正対象機種は、NEC
                   製  PC-9801NS,NS/E,NS/T,NV,NA,NL,NS/L,NS/R の8
                   機種です。
                ○  PaletteNote が 1ならば、 パレットの値を反
                   転します。

                ★ グラフィックモードでしか動作しません
                   (vga4_start(), VTextState変数参照)

------------------------------------------------------------------------
□ palette_show100 - パレット変数の画面への反映(100%固定)

C:      void palette_show100(void);

        ------------------------------------------98N 98H AT DOS-
        palette_show100                            V     ×
        -------------------------------------------

                ● Palettesの内容に従って、パレットのハードウェア
                   に色を設定します。
                   PaletteToneは無視し、100%と見なします。

                ★ palette_showより幾分高速です。
                   速度のためだけに存在します。
                ★ 液晶モードには対応していません。

------------------------------------------------------------------------
□ palette_white, dac_white - 画面を真っ白にする

C:      void palette_white(void);                          マクロ
C:      void dac_white_white(void);                        マクロ

        ------------------------------------------98N 98H AT DOS-
        palette_white                              V     *
        dac_white                                  ×  × ○
        -----------------------------------------------------<->-

                ● パレットの明るさを  200%にすることで画面を真っ
                   白にします。あとで100%に戻さないと、いつまでた
                   っても真っ白です。

------------------------------------------------------------------------
□ palette_white_in, dac_white_in - 画面を白からフェードインする

C:      void palette_white_in( unsigned speed );
C:      void dac_white_in( unsigned speed );

        ------------------------------------------98N 98H AT DOS-
        palette_white_in                           V     *
        --------------------------------------------
        dac_white_in                               ×  × ○
        --------------------------------------------

                ● 最初にパレットのトーンを 200(白)に設定し、徐々
                   に 100(本来の色)へと変化させます。変化させる速
                   さはspeed で指定します。

                ← speed 変化させる速さ
                         0 が最速で、1  以上にするとパレットを  1
                         段階変化させるのに speed 回の VSYNC を待
                         ちます。  つまり、 speed * 16 回の VSYNC
                         だけの時間を消費します。

                ○ 内部で  palette_show  と  vsync_wait,   または
                   dac_show と vga_vsync_wait を呼んでいます。

                ★ 実行後、トーンは 100%になります。

------------------------------------------------------------------------
□ palette_white_out, dac_white_out - 画面を白にフェードアウトする

C:      void palette_white_out( unsigned speed );
C:      void dac_white_out( unsigned speed );

        ------------------------------------------98N 98H AT DOS-
        palette_white_out                          V     *
        -------------------------------------------
        dac_white_out                              ×  × ○
        -------------------------------------------

                ● 最初にパレットのトーンを 100  (本来の色)に設定
                   し、徐々に 200 (白)へと変化させます。

                ← speed 変化させる速さ
                         0 が最速で、1  以上にするとパレットを  1
                         段階変化させるのに speed 回の VSYNC を待
                         ちます。  つまり、 speed * 16 回の VSYNC
                         だけの時間を消費します。

                ○ 内部で  palette_show  と  vsync_wait,   または
                   dac_show と vga_vsync_wait を呼んでいます。

                ★ 実行後、トーンは 200%になります。このため、 こ
                   の後トーンを再設定しない限りパレットをどんな値
                   に設定しても画面は白いままになるので注意が必要
                   です。


------------------------------------------------------------------------
■ PC-9801 ノーマルモード常駐パレット操作 ■■■■■■■■■■■■■■■

        ●常駐パレットとは
         PC-9801ノーマルモードでは、パレットは書き込み専用であり、
        読むことができません。(無理に読んでも異なる値になる)
         このため、プログラムが終了したあと、 画面に残った絵を他
        のプログラムが利用したくても、 色が分からないという問題が
        あります。これを解決するため、 パソコン通信上で有志が決め
        た、 書き込んだパレットのコピーをメモリ内に保存しておく規
        格です。
         私はこの出所を正確に知らないのですが、 このきまりに従っ
        たソフトがパソコン通信では結構あるので、 対応したというわ
        けです。

------------------------------------------------------------------------
□ 構造体/グローバル変数

unsigned ResPalSeg;     常駐パレットの存在するセグメントアドレス。
                        0なら不在か、または未検索。

------------------------------------------------------------------------
□ respal_create - 常駐パレットの作成

C:      int respal_create(void);

        ------------------------------------------98N 98H AT DOS-
        respal_create                                     × 5
        -------------------------------------------

                ● 常駐パレットを作成します。
                   すでに存在する場合、なにもしません。
                   存在しない場合、メインメモリの末尾の64バイトの
                   メモリを確保して作成します。

                → 0  メモリ不足で失敗
                   1  作成した(パレット等の値は不定)
                   2  すでに存在している

                ★ 常駐パレットを作成した場合、内容は書き込みませ
                   ん。respal_set_palettes()によって master.libで
                   管理するパレットのコピーを書き込むことができま
                   す。

                ★ master.libのメモリマネージャを呼び出す関数を
                   mem_assignなしで呼び出すと、メモリが全く空いて
                   いないことが多いので、起動してからなるべく早い
                   時期に実行したほうがいいでしょう。

------------------------------------------------------------------------
□ respal_exist - 常駐パレットの存在検査

C:      int respal_exist(void);

        ------------------------------------------98N 98H AT DOS-
        respal_exist                                      × 5
        -------------------------------------------

                ● 常駐パレットを検索します。
                   UMBは検索しません。
                   見つかったら常駐しているセグメント値を、見つか
                   らなければ 0 を返します。

------------------------------------------------------------------------
□ respal_free - 常駐パレットの開放

C:      void respal_free(void);

        ------------------------------------------98N 98H AT DOS-
        respal_free                                       × 5
        --------------------------------------------

                ● 常駐パレットを開放します。
                   まだ検索されていない場合、検索も行います。
                   存在しなければなにもしません。

------------------------------------------------------------------------
□ respal_get_palettes - 常駐パレットからパレット変数への読み込み

C:      void respal_get_palettes(void);

        ------------------------------------------98N 98H AT DOS-
        respal_get_palettes                        ○     ×
        -------------------------------------------

                ● 常駐パレットに書かれた、  トーンとパレット値を
                   Palettes, PaletteToneに設定します。
                   内部で respal_exist を呼び出しています。
                   常駐パレット存在しないと何もしません。

------------------------------------------------------------------------
□ respal_set_palettes - パレット変数から常駐パレットへの書き込み

C:      void respal_set_palettes(void);

        ------------------------------------------98N 98H AT DOS-
        respal_set_palettes                        ○     ×
        -------------------------------------------

                ● Palettes,  PaletteToneの値を常駐パレットに書き
                   込みます。
                   事前に常駐パレットが respal_exist によって検索
                   されているか、respal_create によって作成されて
                   いなければ何もしません。


------------------------------------------------------------------------
■ PC-9801 外字処理 ■■■■■■■■■■■■■■■■■■■■■■■■■■

         PC-9801シリーズは、テキストフォントに外字が定義できます。
         外字領域は、 カタログに外字が63文字と表記されている機種
        では  64文字分、188文字と表記されている機種では 256文字分
        のメモリが用意されています。
         ところが、テキスト画面へ表示しようとすると、00h と  80h
        の二つの文字が半角 'V' に化けてしまいます。これは、VRAMに
        書き込む値が半角'V'と全く同じコードになってしまうことと、
        外字より半角が優先されることから来ます。
         グラフィックとして描画するためのフォント記憶領域として
        使う場合は問題ありません。
         EPSONの機種では、0,1,16,17,128,129,144,145の  8文字が登
        録できないものがあります。 この場合は表示どころの騒ぎでは
        ありません。:-)
         このため、通常はこれらのコードは避けて使用してください。
         また、通常は外字を定義する前に内容を gaiji_backup  で保
        存して、外字の使用を終了したら gaiji_restore で復元してく
        ださい。DOSのテキスト画面のフォントを外字で置換えている人
        がいますので。

------------------------------------------------------------------------
□ gaiji_backup - 外字の退避

C:      int gaiji_backup(void);

        ------------------------------------------98N 98H AT DOS-
        gaiji_backup                               ○  × × ○
        -------------------------------------------

                ● メインメモリに外字形状を待避します。

                → 1 成功
                   0 失敗(すでに待避されている, メモリがない )

                △MEMORY: 512パラグラフ(=8KB)のブロックを確保しま
                  す。

------------------------------------------------------------------------
□ gaiji_entry_bfnt - 外字をBFNTファイルから登録する

C:      int gaiji_entry_bfnt( const char * filename );

        ------------------------------------------98N 98H AT DOS-
        gaiji_entry_bfnt                           ○  × × ○
        -------------------------------------------

                ● 指定形式のBFNTファイル(  1.6に依るがバージョン
                   は無視している, モノクロ, 16x16dot, 0から255番
                   に固定, 拡張ヘッダの有無は問わず(内容は無視) )
                   を読み込んで、外字に一括登録します。このときに
                   一時的に  smem_wget()によってメモリを8KB確保し
                   ます。また、file_ropen()を呼び出しているので、
                   file_ropen()の規定に従った準備をしてください。

                → 1 成功
                   0 失敗( メモリない/ファイルが開けない/指定形式
                   のBFNTじゃない )

                ★ この関数は、現在の外字の退避を行いません。退避
                   には gaiji_backup()などを利用して下さい。

------------------------------------------------------------------------
□ gaiji_putc - 外字で1文字表示(属性なし)

C:      void gaiji_putc( unsigned x, unsigned y, unsigned c );

        ------------------------------------------98N 98H AT DOS-
        gaiji_putc                                 ○     ×
        ---------------------------------------------

                ● テキスト画面の y行目(0 が一番上)の x桁目(0  が
                   一番左)の地点に、外字を直接書き込みます。

                ← x,y  表示テキスト座標
                   c    文字コード(0~255)

                ○ 書き込む地点の色、属性は変化しません。
                ○ c に指定した値が 0と128のときは、 外字ではなく
                   'V'が表示されます。

                ★ 画面外を指定すると、関係ないメモリ内容を破壊す
                   ることになるかもしれません。

------------------------------------------------------------------------
□ gaiji_putca - 外字で1文字表示(属性あり)

C:      void gaiji_putca( unsigned x, unsigned y, unsigned c, unsigned atrb );

        ------------------------------------------98N 98H AT DOS-
        gaiji_putca                                ○     ×
        --------------------------------------------

                ● テキスト画面の y行目(0 が一番上)の x桁目(0  が
                   一番左)の地点に、 属性atrbで外字を直接書き込み
                   ます。

                ← x,y   表示テキスト座標
                   c     文字コード(0~255)
                   atrb  属性

                ○ c に指定した値が 0と128のときは、 外字ではなく
                   'V'が表示されます。

                ★ 画面外を指定すると、関係ないメモリ内容を破壊す
                   ることになるかもしれません。

------------------------------------------------------------------------
□ gaiji_putni - 外字で数字列を表示(幅指定あり,属性なし)

C:      void gaiji_putni( unsigned x, unsigned y,  unsigned  val,
                         unsigned width );

        ------------------------------------------98N 98H AT DOS-
        gaiji_putni                                ○     ×
        --------------------------------------------

                ● テキスト画面に外字で数字を直接書き込みます。
                    書き込む地点の色、属性は変化しません。

                ← x      左端の桁の画面上の位置(0=画面左端)
                   y      画面上の行位置(0=画面上端)
                   val    表示したい数値(0~65535)
                   width  表示する桁数 (数値の下から width 桁が表
                          示されます)

                ★ 画面外を指定すると、関係ないメモリ内容を破壊す
                   ることになるかもしれません。
                ★ val が width  桁に満たないときに左側に空いた桁
                   は、'0'が埋められます。

------------------------------------------------------------------------
□ gaiji_putnia - 外字で数字列を表示(幅指定あり,属性あり)

C:      void gaiji_putnia( unsigned x, unsigned y, unsigned  val,
                          unsigned width, unsigned atrb );

        ------------------------------------------98N 98H AT DOS-
        gaiji_putnia                               ○     ×
        -------------------------------------------

                ● テキスト画面に外字で数字を直接書き込みます。

                ← x      左端の桁の画面上の位置(0=画面左端)
                   y      画面上の行位置(0=画面上端)
                   val    表示したい数値(0~65535)
                   width  表示する桁数 (数値の下から width 桁が表
                          示されます)
                   atrb   表示するテキスト属性

                ★ 画面外を指定すると、関係ないメモリ内容を破壊す
                   ることになるかもしれません。
                ★ val が width  桁に満たないときに左側に空いた桁
                   は、'0'が埋められます。

------------------------------------------------------------------------
□ gaiji_putp - 外字でパスカル文字列を表示(属性なし)

C:      void gaiji_putp( unsigned x, unsigned y, char * pstr );

        ------------------------------------------98N 98H AT DOS-
        gaiji_putp                                 ○     ×
        ---------------------------------------------

                ● テキスト画面の y行目(0 が一番上)の x桁目(0  が
                   一番左)からの領域に外字文字列を直接書き込みま
                   す。
                    書き込む地点の色、属性は変化しません。

                ★ 画面外を指定すると、関係ないメモリ内容を破壊す
                   ることになるかもしれません。

------------------------------------------------------------------------
□ gaiji_putpa - 外字でパスカル文字列を表示(属性あり)

C:      void gaiji_putpa( unsigned x, unsigned y, char * pstr, unsigned atrb );

        ------------------------------------------98N 98H AT DOS-
        gaiji_putpa                                ○     ×
        --------------------------------------------

                ● テキスト画面の y行目(0 が一番上)の x桁目(0  が
                   一番左)からの領域に外字文字列を属性atrbで直接
                   書き込みます。

                ★ 画面外を指定すると、関係ないメモリ内容を破壊す
                   ることになるかもしれません。

------------------------------------------------------------------------
□ gaiji_puts - 外字で文字列を表示(属性なし)

C:      void gaiji_puts( unsigned x, unsigned y, char * str );

        ------------------------------------------98N 98H AT DOS-
        gaiji_puts                                 ○     ×
        ---------------------------------------------

                ● テキスト画面の y行目(0 が一番上)の x桁目(0  が
                   一番左)からの領域に外字文字列を直接書き込みま
                   す。
                    書き込む地点の色、属性は変化しません。

                ★ 画面外を指定すると、関係ないメモリ内容を破壊す
                   ることになるかもしれません。

------------------------------------------------------------------------
□ gaiji_putsa - 外字で文字列を表示(属性あり)

C:      void gaiji_putsa( unsigned x, unsigned y, char * str, unsigned atrb );

        ------------------------------------------98N 98H AT DOS-
        gaiji_putsa                                ○     ×
        --------------------------------------------

                ● テキスト画面の y行目(0 が一番上)の x桁目(0  が
                   一番左)からの領域に外字文字列を属性atrbで直接
                   書き込みます。

                ★ 画面外を指定すると、関係ないメモリ内容を破壊す
                   ることになるかもしれません。

------------------------------------------------------------------------
□ gaiji_read - 外字の読み取り(1文字)

C:      void gaiji_read( int code, void far * pattern );

        ------------------------------------------98N 98H AT DOS-
        gaiji_read                                 ○  × ×
        ---------------------------------------------

                ● 外字形状を1文字読み取ります。
                    パターンは、左8dot,右8dotの順に計2バイト、こ
                   れが上から順に16ライン分並ぶ形になります。

------------------------------------------------------------------------
□ gaiji_read_all - 外字の読み取り(256文字)

C:      void gaiji_read_all( void far * pattern );

        ------------------------------------------98N 98H AT DOS-
        gaiji_read_all                             ○  × ×
        ---------------------------------------------

                ● 外字形状をすべて読み込みます。
                    パターンは、左8dot,右8dotの順に計2バイト、こ
                   れが上から順に16ライン分並ぶ形になります。

------------------------------------------------------------------------
□ gaiji_restore - 外字の復元

C:      int gaiji_restore(void);

        ------------------------------------------98N 98H AT DOS-
        gaiji_restore                              ○  × × ○
        -------------------------------------------

                ● gaiji_backup()で待避した外字パターンを復元し、
                   占有していたメモリを開放します。

                → 1 成功
                   0 失敗( 退避していない )

------------------------------------------------------------------------
□ gaiji_write - 外字の登録(1文字)

C:      void gaiji_write( int code, const void far * pattern );

        ------------------------------------------98N 98H AT DOS-
        gaiji_write                                ○  × ×
        --------------------------------------------

                ● 外字形状を1文字登録します。
                   codeの値には  0~255が指定でき、 0~127は  NEC
                   JISの7600h~767fhに対応し、 128~255は 7700h~
                   777fhに対応します。
                    外字が  63文字とカタログに表記されている機種
                   の場合、32~95の 64文字が指定でき、188文字と表
                   記されている機種では  0~255の全てが指定できま
                   す。
                    パターンは、左8dot,右8dotの順に計2バイト、こ
                   れが上から順に16ライン分並ぶ形になります。

                ★ EPSONの一部の機種では
                   0,1,16,17,128,129,144,145の  8文字が登録できな
                   いものがあります。

------------------------------------------------------------------------
□ gaiji_write_all - 外字の登録(256文字)

C:      void gaiji_write_all( const void far * pattern );

        ------------------------------------------98N 98H AT DOS-
        gaiji_write_all                            ○  × ×
        --------------------------------------------

                ● 外字形状を256文字登録します。
                    外字が  63文字とカタログに表示されている機種
                   の場合、 このうちの(0番を先頭として)32~95番の
                   64文字のみが登録されます。
                    パターンは、左8dot,右8dotの順に計2バイト、こ
                   れが上から順に16ライン分並ぶ形になります。


------------------------------------------------------------------------
■ フォント処理 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■

         ANKのフォントパターンを、独自に管理します。

------------------------------------------------------------------------
□ 構造体/グローバル変数

const volatile int font_ReadChar;  <98>割り込みによってこれから読
                                   み込む文字コード
const int font_ReadEndChar;        <98>割り込みで読み込む最後の文
                                   字コード
void (far *font_AnkFunc)(void);    全角フォント読み取りルーチ
                                   ンのアドレス
void (far *font_KanjiFunc)(void);  半角フォント読み取りルーチ
                                   ンのアドレス

------------------------------------------------------------------------
□ font_at_entry_cgrom - システム半角fontを内部半角フォントに登録

C:      int font_at_entry_cgrom( unsigned firstchar, unsigned lastchar );

        ------------------------------------------98N 98H AT DOS-
        font_at_entry_cgrom                        ×  × ○
        -------------------------------------------

                ● システム半角フォント(8x16dot)をfont_write()で
                   登録します。

                ← firstchar  開始文字コード(0~255)
                   lastchar   終了文字コード(firstchar~255)

                → 0   成功(失敗しません)

                ★ firstchar > lastchar である場合、 何もせずに終
                   了します。
                ★ 98版 font_entry_cgromと異なり、 処理は短時間で
                   終わり、戻ってきたときには完了しています。

------------------------------------------------------------------------
□ font_at_init - フォントの読み取り準備

C:      void font_at_init(void);

        ------------------------------------------98N 98H AT DOS-
        font_at_init                               ×  × ○ V
        -------------------------------------------

                ● DOS/Vの文字フォント読み取りルーチンのアドレス
                   を取得し、記憶します。 DOS/Vが認識するビデオモ
                   ード(03h,12hなど)でこの関数を実行すると、 以後
                   SVGAのグラフィックモード(VESA SVGA  800x600dot
                   など)に変更しても日本語のフォントが
                   font_at_read で読み込めるようになります。

                ○ font_AnkFunc, font_KanjiFunc変数を設定します。
                ○ 英語フォントだけが使いたい場合は、
                   font_at_init_us()が使えます。

                ★ 日本語の画面モードでしか使わないのであれば必要
                   ありません。

------------------------------------------------------------------------
□ font_at_init_us - フォントの読み取り準備(強制英語フォント)

C:      void font_at_init_us(void);

        ------------------------------------------98N 98H AT DOS-
        font_at_init_us                            ×  × ○ V
        -------------------------------------------

                ● DOS/Vと英語DOSで異なるフォントが使われるように
                   するため、強制的に英語フォントを使うように設定
                   します。漢字を取得しようとすると、 "豆腐"(塗り
                   つぶされた四角形)が得られるようになります。

                ○ font_AnkFunc, font_KanjiFunc変数を設定します。

------------------------------------------------------------------------
□ font_at_read - フォントの読み取り

C:      int font_at_read( unsigned ccode, unsigned fontsize, void far * buf);

        ------------------------------------------98N 98H AT DOS-
        font_at_read                               ×  × ○
        -------------------------------------------

                ● AX=1800h, int 10h を呼び出すことで、フォントデ
                   ータを読み取ります。

                ← ccode        文字コード
                   fontsize     上位8bit: 横ドット数
                                下位8bit: 縦ドット数
                   buf          フォントデータの格納先(ベタ形式)

                → NoError      成功
                   InvalidData  失敗(指定サイズのフォントがないな
                                ど)

                ★ get_machineを事前に実行する必要があります。

------------------------------------------------------------------------
□ font_entry_bfnt - フォントのBFNTファイルからの登録

C:      int font_entry_bfnt(const char *filename);

        ------------------------------------------98N 98H AT DOS-
        font_entry_bfnt                            ○        ○
        -------------------------------------------

                ● BFNT 形式のファイルを読み込み、ANK  フォントと
                   して登録します。
                   8x16dotフォント以外の場合、graph_bfnt_puts,
                   graph_bfnt_putpのどちらか以外では正しく表示で
                   きません。

                ← BFNTファイル名 (データは必ず 2色)

                → NoError             成功
                   FileNotFound        ファイルが開けない
                   InvalidData         フォントファイルが使えない
                                       規格である
                   InsufficientMemory  フォントを登録する為のメモ
                                       リが足りない

                ★ 文字の大きさは、横は8dot単位で、かつ((横ドット
                   数/8)*縦ドット数)が16の倍数になる大きさでなけ
                   ればなりません。
                ★ graph_bfnt_puts, graph_bfnt_putpのどちらかで表
                   示するのでなければ、文字の大きさは 8x16dotでな
                   ければなりません。

                △MEMORY: 以前に確保されていなければ  font_AnkSeg
                  に  256文字ぶん、たとえば8x16dotなら256パラグラ
                  フのブロックを確保します。

------------------------------------------------------------------------
□ font_entry_cgrom - フォントのCG ROMからの登録

C:      int font_entry_cgrom( unsigned firstchar, unsigned lastchar );

        ------------------------------------------98N 98H AT DOS-
        font_entry_cgrom                           ○  × * ○
        -------------------------------------------

                ● VSYNC割り込みを使って、98本体のフォントROMの半
                   角ANKデータを読み込み、ANK  フォントとして登録
                   する作業を開始します。
                    font_ReadChar > font_ReadEndChar  が成立した
                   ときが読み込み完了したときです。

                ← firstchar    読み込み開始文字
                   lastchar     読み込み終了文字

                → NoError             読み込みを開始した
                   InsufficientMemory  フォントを登録する為のメモ
                                       リが足りない
                   InvalidData         フォントの大きさが8x16dot
                                       じゃない

                ★ この関数を呼び出す前に vsync_startを実行する必
                   要があります。
                ★ 内部で vsync_proc_set を実行していますので、以
                   前の設定は失われます。読み込み完了確認後に再設
                   定してください。
                ★ vsync_startを実行したら、プログラム終了前に
                   vsync_endを実行する必要があります。

                ○ <98> VSYNC割り込み一回で 1文字読み込んでいます。
                   このため 256文字指定した場合、25行モードで 5秒
                   弱かかります。
                ○  ATではすぐに処理が完了します。

                △MEMORY: 確保されていなければ font_AnkSeg に 256
                  パラグラフのブロックを確保します。

------------------------------------------------------------------------
□ font_entry_gaiji - フォントの外字からの登録

C:      void font_entry_gaiji(void);

        ------------------------------------------98N 98H AT DOS-
        font_entry_gaiji                           ○  × × ○
        -------------------------------------------

                ● 外字を半角として登録してある事を前提に、 ANKフ
                   ォントとして登録します。

                ○ 登録範囲は、NEC JIS外字 7620h~769fhを ANK 00h
                   ~7fhに割り当てます。

                ★ メモリに確保されたfontの大きさが8x16dot以外な
                   ら(font_AnkSize!=0x0110)、何もしません。

                △MEMORY: 以前に確保されていなければ  font_AnkSeg
                  に 256パラグラフのブロックを確保します。

------------------------------------------------------------------------
□ font_entry_kcg - フォントの2バイト半角からの登録

C:      void font_entry_kcg(void);

        ------------------------------------------98N 98H AT DOS-
        font_entry_kcg                             ○  × * ○
        -------------------------------------------

                ● 2バイト半角のフォントの内、 英数記号およびカタ
                   カナ部分のみを ANKフォントとして登録します。

                ○ 登録範囲は、20h(空白)~7eh(~),  a1h(。)~dfh(゚)
                   です。

                ★ メモリに確保されたfontの大きさが8x16dot以外な
                   ら(font_AnkSize!=0x0110)、何もしません。

                △MEMORY: 確保されていなければ font_AnkSeg に 256
                  パラグラフのブロックを確保します。

------------------------------------------------------------------------
□ font_read - フォントの読み取り

C:      void font_read( unsigned code, void * pattern );

        ------------------------------------------98N 98H AT DOS-
        font_read                                  ○  × *
        -------------------------------------------

                ● JISまたはシフトJISコードで文字を指定すると、そ
                   の文字の形状を pattern に格納します。
                    格納形式は、左半分(8x16dot)を上から順に、 次
                   に右半分(〃)を格納します。(計32バイト)
                   半角は codeに 0~255を入れて呼び出すこと
                   で、font_entry_bfnt()でメモリ上に読み込んだパタ
                   ーンを得ることができます。

------------------------------------------------------------------------
□ font_write - フォントの登録

C:      void font_write( unsigned code, const void * pattern );

        ------------------------------------------98N 98H AT DOS-
        font_write                                 ○  × ○
        -------------------------------------------

                ● 外字および半角フォントを定義します。

                ← code  0~255   半角フォントデータ(8x16dot固定)
                                  の書き換え。以前に1文字も登録さ
                                  れていなければ、 新たにメモリが
                                  確保されます。
                         256以上  <98>JISコードや、 シフトJISコー
                                  ドを指定することで、 漢字フォン
                                  トROMを書き換えます。ただし実際
                                  に書き換えられるのは、 外字領域
                                  だけです。
                                  絶対に指定してはいけません。

                ○ パターンは、左半分(8x16dot)を上から順に、 次に
                   右半分(〃)を格納します。(計32バイト)
                ○ <98>gaiji_writeと似ていますが、 文字コードと、
                   パターンの並びが違います。

                ★ メモリに確保されたfontの大きさが8x16dot以外な
                   ら(font_AnkSize!=0x0110)、何もしません。

                △MEMORY: 以前に確保されていなければ  font_AnkSeg
                  に 256パラグラフのブロックを確保します。

------------------------------------------------------------------------
□ wfont_entry_bfnt - 圧縮フォントのBFNTファイルからの登録

C:      int wfont_entry_bfnt(const char *);

        ------------------------------------------98N 98H AT DOS-
        wfont_entry_bfnt                           ○        ○
        -------------------------------------------

                ● BFNT 形式のファイルを読み込み、 圧縮フォントの
                   ANK 部分として登録します。
                   圧縮フォントの ANK 部分は、単に 8x8dot  のフォ
                   ントになります。
                   (全角部分は、縦に半分に圧縮して  2プレーンを使
                   用して表示されます)

                ← BFNTファイル名 (データは必ず 2色,8x8dot)

                → NoError             成功
                   FileNotFound        ファイルが開けない
                   InvalidData         フォントファイルが使えない
                                       規格である
                   InsufficientMemory  フォントを登録する為のメモ
                                       リが足りない

                △MEMORY: 128パラグラフのブロックを確保します。


------------------------------------------------------------------------
■ グラフィックカーソル ■■■■■■■■■■■■■■■■■■■■■■■■

        ★PC-9801 16色, PC/AT VGA 16色モードにのみ対応します。
         グラフィック画面用カーソルを管理します。
         グラフィックカーソルは、16x16dotで任意の2色を使うことが
        できます。
         表示状態は、16ビット符号付き整数で管理し、0を表示、負数
        を非表示とします。(マイクロソフトマウスドライバと同じ)
         移動範囲は、安全のため、画面全体でのみ制限します。 が、
        カーソル位置を取得する方法を用意していません。 カーソル範
        囲や位置は、呼び出し側で管理してください。
        使い方の骨格:
         準備:
                cursor_init();                          /*   必要
                                                        */
                cursor_pattern(cx,cy,bc,wc,pattern);    /*   必要
                                                        */
                cursor_moveto( x,y );   /* 初期位置 */  /* 必要に
                                                        応じて */
                cursor_show();          /* カーソル表示 */
         表示:
                cursor_moveto( x,y );   /* カーソル移動 */
                cursor_hide();          /* カーソル除去 */
                cursor_moveto( x,y );   /* カーソル移動 */
                cursor_show();          /* カーソル表示 */
         終り:
                cursor_hide();          /* カーソル除去 */

------------------------------------------------------------------------
□ 構造体/グローバル変数

        ● カーソル形状構造体(cursor_setpattern()で利用してくださ
           い)
struct CursorData {
    unsigned char px, py;
    unsigned pattern[32];
};
struct CursorData cursor_Arrow; 左上向きの矢印
struct CursorData cursor_Cross; 十字
struct CursorData cursor_Hand;  手(人差し指を立てている)
struct CursorData cursor_Ok;    (Ok?)

------------------------------------------------------------------------
□ cursor_hide - カーソルの表示カウンタ減少

C:      int cursor_hide(void);

        ------------------------------------------98N 98H AT DOS-
        cursor_hide                                V  × ○
        ---------------------------------------------

                ● 現在の表示カウンタを減少し、 -1になったなら(今
                   まで0だったなら)画面上のカーソルを除去します。

                → 実行後の表示カウンタ(-1なら除去した)

------------------------------------------------------------------------
□ cursor_init - カーソル表示状態の初期化

C:      void cursor_init(void);

        ------------------------------------------98N 98H AT DOS-
        cursor_init                                V  × ○
        ---------------------------------------------

                ● 現在のカーソル表示状態にかかわらず、表示カウン
                   タを -1 に初期化します。

                ★ PC/ATで実行する場合は、かならず事前に
                   get_machine()を実行し、 かつ16色グラフィックモ
                   ードにしてください。

------------------------------------------------------------------------
□ cursor_moveto - カーソルの移動

C:      void cursor_moveto( int x, int y );

        ------------------------------------------98N 98H AT DOS-
        cursor_moveto                              V  × ○
        ---------------------------------------------

                ● 現在の表示カウンタが 0 ならばカーソルを移動し、
                   そうでないならば無視します。

                ○ 画面外を指定しても、最も近い端に丸められます。

------------------------------------------------------------------------
□ cursor_pattern - カーソルパターンの定義1

C:      void cursor_pattern( int px, int py, int  blc,  int  whc,
                            void far * pattern );

        ------------------------------------------98N 98H AT DOS-
        cursor_pattern                             V  × ○
        ---------------------------------------------

                ● カーソル中のセンターポイントの位置、カーソル描
                   画に使う2色、およびカーソル形状を設定します。
                ← px,py     センターポイント。カーソルパターンの
                             中のどの地点をカーソル座標とするかを
                             表します。0,0が左上、15,15が右下です。
                   blc,whc   0~15 カーソルパターンに使う2色のパ
                             レットコード
                   pattern   カーソルパターン。 blc用が16ワード、
                             続けてwhc用が16ワードです。
                             描画はblc,whcの順に行うので、 両方の
                             ビットが立っている所はwhc側が優先で
                             す。

------------------------------------------------------------------------
□ cursor_pattern2 - カーソルパターンのMOUSE.COM風定義

C:      void cursor_pattern2( int px, int py, int whc, void far * pattern );

        ------------------------------------------98N 98H AT DOS-
        cursor_pattern2                            V  × ○
        --------------------------------------------

                ● MS MOUSE.COMや  gr.libで指定する形式のカーソル
                   データを、 master.lib cursor_*形式に変換して登
                   録します。

                ← px,py     センターポイント。カーソルパターンの
                             中のどの地点をカーソル座標とするかを
                             表します。0,0が左上、15,15が右下です。
                   whc       0~15  "XORマスク"の描画に使うパレッ
                             トコード
                   pattern   カーソルパターン。 ANDマスクが16ワー
                             ド、続けてXORマスクが16ワードです。
                             ただし、XORマスクは実際にはXORせず、
                             whcの色で描画する点が異なります。AND
                             マスクは反転を黒で描画することにより、
                             同一結果になるよう変換しています。

------------------------------------------------------------------------
□ cursor_setpattern - カーソルパターンの定義2

C:      void cursor_setpattern(  struct CursorData cdat, int blc,
                               int whc )                   マクロ

        ------------------------------------------98N 98H AT DOS-
        cursor_setpattern                          V  × ○
        -----------------------------------------------------<->-

                ● CursorData構造体によってカーソルパターンを定義
                   します。

------------------------------------------------------------------------
□ cursor_show - カーソルの表示カウンタ増加

C:      int cursor_show(void);

        ------------------------------------------98N 98H AT DOS-
        cursor_show                                V  × ○
        ---------------------------------------------

                ● 現在の表示カウンタが 0 でなければ増加し、0にな
                   ったならばカーソルを描画します。

                → 実行後の表示カウンタ(0なら描画した)

                ★ カーソルが描画された状態で、ほかの手段でグラフ
                   ィック画面をアクセスするとカーソルが移動したと
                   きにその付近がおかしくなります。


------------------------------------------------------------------------
■ パターン/キャラクタの登録/削除 ■■■■■■■■■■■■■■■■■■■

         パターンは、 16色(透明色を含む)の小さなグラフィックデー
        タを登録し、管理番号を振ったものです。

         キャラクタは、パターン番号と、 パターンを表示するときに
        待避する領域を持った構造体を登録し、 管理番号を振ったもの
        です。

         表示するパターン/キャラクタは、あらかじめ登録しておく必
        要があります。super_put() 系、 仮想VRAM系の関数を利用する
        場合にはパターンとして、super_in() 系の関数を利用する場合
        にはキャラクタとして登録する必要があります。

         super_entry_pat()では、  透明色が指定できます。  通常は
        color  0 を指定するが、別の色に変更することもできます。透
        明色として指定した色の部分は背景が透けて残ることになりま
        す。

         登録していない番号や、削除した番号のパターン/キャラクタ
        を表示した場合の動作は予想できません。

------------------------------------------------------------------------
□ 構造体/グローバル変数

unsigned super_patdata[];       パターンごとのパターンデータのセ
                                グメントアドレス
unsigned super_patsize[];       パターンごとのパターンデータの大
                                きさ
                                (上位8bit=横ドット数  /  8,  下位
                                8bit=縦ドット数)
unsigned super_buffer;          パターン処理のための一時作業領域
                                のセグメントアドレス。
unsigned super_patnum;          次に登録されるパターン番号。 常に
                                末尾の番号+1です。

const char BFNT_ID[5];          "BFNT\x1a"(BFNTファイルのID文字列)


------------------------------------------------------------------------
□ super_backup_ems - 登録されたパターンをEMSに待避

C:      int super_backup_ems( unsigned * handle,  int  first_pat,
                             int last_pat );

        ------------------------------------------98N 98H AT DOS-
        super_backup_ems
        -------------------------------------------

                ● 指定範囲の登録済みパターンを、一括して EMSにコ
                   ピーします。

                ← handle     待避管理ブロックのセグメントアドレ
                              スの格納先
                   first_pat  最小番号
                   last_apt   最大番号

                → NoError              保存成功(作業完了)
                   InsufficientMemory   EMSが足りない(作業前)
                   GeneralFailure       その範囲にデータは全く登
                                        録されていない(作業前)
                   InvalidData          first_pat,last_patの値が
                                        無効(作業前)
                                        (first_pat > last_patのと
                                        き、 どちらかが最終登録番
                                        号より大きかったとき)

------------------------------------------------------------------------
□ super_cancel_pat - パターンの削除

C:      int super_cancel_pat( int num );

        ------------------------------------------98N 98H AT DOS-
        super_cancel_pat
        -------------------------------------------

                ● 登録されているパターンを削除、占有していたメモ
                   リを開放します。

                ← num パターン番号

                → NoError        成功
                   GeneralFailure 登録されていない番号を指定した

                ★ 最後のパターン (最大の番号のパターン) を削除し
                   た場合には、次に登録されるパターンの番号は、残
                   っている最大の番号の次の番号に変更されます。

                △MEMORY:  パターンに使用されていたメモリを開放し
                  ます。

------------------------------------------------------------------------
□ super_change_erase_pat - 消去パターンの変更

C:      void super_change_erase_pat( int num, void far *image);

        ------------------------------------------98N 98H AT DOS-
        super_change_erase_pat
        -------------------------------------------

                ● 指定パターンの消去パターンを再設定します。

                ← num    変更対象のパターン番号
                   image  新しい消去パターン(ベタ形式)

                ★ image の size は、登録したパターンと同じ  size
                   でなければなりません。
                ★ image はコピーして登録されます。
                ★ 登録済みのキャラクタにも変更が反映されます。

------------------------------------------------------------------------
□ super_clean - 複数パターンの削除

C:      void super_clean( int min_pat, int max_pat );

        ------------------------------------------98N 98H AT DOS-
        super_clean
        -------------------------------------------

                ● パターン番号 min_patからmax_patまでを、 すべて
                   登録されていない状態にします。

                ← min_pat 最小番号
                   max_pat 最大番号

                ○ もともと何も登録されていない領域の場合、または
                   max_pat < min_pat の場合は何もしません。

------------------------------------------------------------------------
□ super_convert_tiny - パターンデータ形式を高速表示用に変換

C:      int super_convert_tiny( int num );

        ------------------------------------------98N 98H AT DOS-
        super_convert_tiny                                *
        -------------------------------------------

                ● すでに登録されたパターン num のデータを、 高速
                   表示用形式に変換します。

                → InvalidData  パターン番号が異常、 またはパター
                                ンデータに  5色以上使われている。
                                このときはパターンデータは破壊さ
                                れない。
                   NoError      変換成功

                ★ この形式に変換したら、表示は super_put_tiny ま
                   たは  super_put_tiny_small  でしか行えません。
                   (異常なパターンになります)

                ★ この高速形式は、使われている色が  透明+4色以内
                   のデータに対してしか行えません。 なぜなら、5色
                   以上ならばこの形式を使った場合に却って遅くなる
                   からです(^^;

                ★ VGAでは、 tiny形式にしてもそれほど高速化が
                   見込まれないので、この関数はATでは無視します。
                   また、tiny描画関数もすべて通常の描画関数で置き
                   変わります。

                ○ 高速形式とは、通常 4プレーン全てに順番にアクセ
                   スして描画するのに対し、GRCGの色指定を利用して
                   色ごとの描画をするようにしたものです。この関係
                   で、色数が少なければそれだけ高速になります。
                ○ シューティングゲームの弾など、2~3色程度しか使
                   わずパターンも小さいが大量に表示されるものは、
                   高速形式を使う事をお奨めします。

------------------------------------------------------------------------
□ super_dup - パターンの複製を登録

C:      int super_dup(int pat);                            マクロ

        ------------------------------------------98N 98H AT DOS-
        super_dup
        -----------------------------------------------------<->-

                ● すでに登録されたパターン pat  と全く同一内容の
                   データを、新たに登録します。

                ← pat     複写元パターン番号

                → 0~511               登録したパターン番号
                   InsufficientMemory   メモリが足りない
                   GeneralFailure       patが登録されていない、登
                                        録パターンが512に達した

                △MEMORY: patに使用していたメモリと同じだけ確保し
                  ます。

------------------------------------------------------------------------
□ super_duplicate - パターンの複製を指定番号に登録

C:      int super_duplicate(int topat, int frompat);

        ------------------------------------------98N 98H AT DOS-
        super_duplicate
        -------------------------------------------

                ● すでに登録されたパターン frompat  と全く同一内
                   容のデータを、パターン番号topatに作成します。

                ← topat     登録先番号
                   frompat   複写元パターン番号

                → 0~511               登録したパターン番号
                   InsufficientMemory   メモリが足りない
                   GeneralFailure       frompatが登録されていない、
                                        または topat が512以上

                ○ すでにtopatにデータが存在する場合は、 自動的に
                   開放してくれます。

                △MEMORY: frompatに使用していたメモリと同じだけ確
                  保します。

------------------------------------------------------------------------
□ super_entry_at - パターンを直接登録

C:      int super_entry_at( int num, int patsize, unsigned pat_seg );

        ------------------------------------------98N 98H AT DOS-
        super_entry_at
        --------------------------------------------

                ● すでに使用する形式でhmemブロックに書き込まれた
                   パターンを登録します。

                ← num      登録先のパターン番号。 すでに存在した
                            ら古い物は開放されてから登録される。
                   patsize  パターンサイズ。super_entry_pat参照
                   pat_seg  パターンデータを使用する形式で格納し
                            た、 hmemメモリブロックの先頭セグメン
                            トアドレス。

                ★ この関数は、他の関数から内部的に呼び出されてい
                   る下位関数です。

                ○ パターンデータは、メモリブロックのoffset 0番地
                   からマスク、青、赤、緑、 輝度プレーン(それぞれ
                   パターン全体分)の順にならべた形式です。 マスク
                   データはbitが0のところが透明を表します。実際の
                   描画は、マスクを黒で塗ってから各プレーンにORし
                   てゆくので、実際に透明にするにはすべてのプレー
                   ンはマスクデータでANDしなければ正しく処理でき
                   ません。

------------------------------------------------------------------------
□ super_entry_char - パターンをキャラクタに登録

C:      int super_entry_char( int num );

        ------------------------------------------98N 98H AT DOS-
        super_entry_char
        -------------------------------------------

                ● パターンをキャラクタに登録します。

                ← パターン番号

                → 0~511             登録されたキャラクタ番号
                   GeneralFailure     登録できるキャラクタ数を越
                                      えている
                   InsufficientMemory  キャラクタを登録するための
                   メモリが足りない

                ★ キャラクタ番号は 0  から順番に割り当てられてい
                   きます。

                △MEMORY:  キャラクタを表示するときの待避領域を確
                  保します。実際の大きさは、super_entry_pat()で登
                  録するのに要した大きさの4/5です。

------------------------------------------------------------------------
□ super_entry_pack - パック16色データからパターンを登録

C:      int super_entry_pack( const void far  *  image,  unsigned
                             image_width, int patsize, int clear_color );

        ------------------------------------------98N 98H AT DOS-
        super_entry_pack
        -------------------------------------------

                ● パック16色形式のデータの一部分をパターンに登録
                   します。

                ← patsize      パターンの大きさ(super_entry_pat
                                参照)
                   image        パックデータのパターンに登録する
                                部分の先頭アドレス
                   image_width  パックデータの横ドット数
                   patsize      パターンの大きさ(super_entry_pat
                                参照)
                   clear_color  透明色(通常は 0)

                → 0~511              パターン番号
                   GeneralFailure      登録できるパターン数を越え
                                       ている
                   InsufficientMemory  パターンを登録する為のメモ
                                       リが足りない

                △MEMORY: super_entry_pat 参照

------------------------------------------------------------------------
□ super_entry_pat - パターンのアドレスを指定して登録

C:      int super_entry_pat( int patsize, void far *image,  int color );

        ------------------------------------------98N 98H AT DOS-
        super_entry_pat
        -------------------------------------------

                ● パターンを登録します。

                ← patsize   パターンの大きさ(下記参照)
                   image     パターンの先頭アドレス
                             (ベタ形式で BRGI プレーンの順)
                   color     透明色(通常は 0)

                → 0~511              パターン番号
                   GeneralFailure      登録できるパターン数を越え
                                       ている
                   InsufficientMemory  パターンを登録する為のメモ
                                       リが足りない

                ★ 登録が成功した場合には imageは far領域にコピー
                   されて保存されるので image(データ本体も含む)は
                   不要となります。
                ★ パターン番号は 0から順番に割り当てられていきま
                   す。
                ★ 登録できるパターンは 512 個までです。

                ★ size の指定は、((xdot/8) * 256 + ydot)で行いま
                   すが、以下のように定数も定義してあるので、ご利
                   用下さい。
                ★ 「パターンに必要なメモリ」が64KBを越えるデータ
                   は正しく処理できません。
                    具体的には、縦を255dotにした場合、横は
                   51*8=408dotまでになります。

                     8 ドット ×  8 ドット  SIZE8x8   0x0108
                    16 ドット × 16 ドット  SIZE16x16 0x0210
                    24 ドット × 24 ドット  SIZE24x24 0x0318
                    32 ドット × 32 ドット  SIZE32x32 0x0420
                    40 ドット × 40 ドット  SIZE40x40 0x0528
                    48 ドット × 48 ドット  SIZE48x48 0x0630
                    56 ドット × 56 ドット  SIZE56x56 0x0738
                    64 ドット × 64 ドット  SIZE64x64 0x0840
                  の中から選択します。 xdots と ydots  が異なる場
                  合 (ex. 32x16)には、
                      xdots
                     8 ドット  xSIZE8  0x0100
                    16 ドット  xSIZE16 0x0200
                    24 ドット  xSIZE24 0x0300
                    32 ドット  xSIZE32 0x0400
                    40 ドット  xSIZE40 0x0500
                    48 ドット  xSIZE48 0x0600
                    56 ドット  xSIZE56 0x0700
                    64 ドット  xSIZE64 0x0800
                  と、
                      ydots
                     8 ドット  ySIZE8  0x0008
                    16 ドット  ySIZE16 0x0010
                    24 ドット  ySIZE24 0x0018
                    32 ドット  ySIZE32 0x0020
                    40 ドット  ySIZE40 0x0028
                    48 ドット  ySIZE48 0x0030
                    56 ドット  ySIZE56 0x0038
                    64 ドット  ySIZE64 0x0040
                  の論理和を指定する (ex. xSIZE32 | ySIZE16)。

                △MEMORY: パターンに必要なメモリを確保します。 そ
                  の実際の大きさは、「横ドット数 / 8 * 縦ドット数
                  *  5バイト」、ただし 16で割った余りがある場合は
                  割り切れるように切り上げた量になります。
                 また、それとは別に、 最初の一つを登録するときに
                管理領域の確保のため、 super_buffer に 9216バイト
                のブロックを確保します。

------------------------------------------------------------------------
□ super_free - すべてのパターンとキャラクタの削除

C:      void super_free(void);

        ------------------------------------------98N 98H AT DOS-
        super_free                                           ○
        -------------------------------------------

                ● すべてのパターンとキャラクタに使用していたメモ
                   リを開放します。これを実行すると、起動してから
                   まだ一度もパターンを登録していなかったのと同じ
                   状態になります。

                △MEMORY:  パターンなどに使用していたメモリを開放
                  します。

------------------------------------------------------------------------
□ super_free_ems - EMSに待避されたパターンを開放

C:      void super_free_ems(void);

        ------------------------------------------98N 98H AT DOS-
        super_free_ems
        -------------------------------------------

                ● super_backup_emsで待避されたすべてのパターンデ
                   ータをEMSから開放します。

                ★ 確保されたhandleは開放されません。すべての
                   handleを、必ず hmem_free()で開放してください。

                ○ handleの開放と  super_free_ems()の実行順序は自
                   由ですが、片方だけ実行することは避けてください。

------------------------------------------------------------------------
□ super_hrev - パターンを左右反転

C:      void super_hrev(int patnum);

        ------------------------------------------98N 98H AT DOS-
        super_hrev
        -------------------------------------------

                ● すでに登録されたパターンを左右反転します。

                ← patnum   左右反転したいパターン番号

                ○ 2度実行すると元にもどります。
                ○ 登録されていない番号を指定した場合、何もせずに
                   帰ってきます。

                ★ 同じパターンを毎回複数個表示している場合、全部
                   一斉に反転してしまいます。これを避けたい場合は、
                   一つ一つ表示の度に必要に応じて反転させるか、
                   super_dupなどで別のパターンにしてしまう方法が
                   あります。

------------------------------------------------------------------------
□ super_restore_ems - EMSに待避されたパターンを再登録

C:      int super_restore_ems( unsigned handle, int load_to );

        ------------------------------------------98N 98H AT DOS-
        super_restore_ems
        -------------------------------------------

                ● super_backup_emsで待避された複数のパターンを一
                   括して再登録します。

                ← handle   super_backup_emsで得た管理セグメント
                            アドレス
                   load_to  先頭の登録番号。 -1なら待避した時点と
                            同じ値

                → NoError              格納成功。(作業完了)
                   InsufficientMemory   復元結果を格納するメモリ
                                        が足りない。(作業途中)
                   InvalidData          load_toが無効(作業前)

                ○ load_to+待避パターン数が512を越える場合にも、
                   何もせずにInvalidDataを返します。
                ○ 再登録先の番号のパターンがすでに存在する場合は、
                   削除しながら更新します。
                ○ 現在登録されている末尾に追加する形で読み込みた
                   い場合は、
                   super_restore_ems( handle, super_patnum );  で
                   行ってください。


------------------------------------------------------------------------
■ BFNT/BFNT+ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

         noenoe   氏提唱の   BFNT/BFNT+   フォーマットは、  free
        software 用の共通フォントファイル形式として普及が進んでい
        ます (gr.manより引用)。
         master.lib   では、  カラーフォントのフォーマットである
        BFNT+  形式のファイルを読み込んでパターンとして登録できま
        す。

         上位関数の super_entry_bfnt()、super_change_erase_bfnt()
        とそれを実現している下位関数に分けられます。
         下位関数を利用するとヘッダや拡張ヘッダにアクセスするこ
        とができます。

         super_entry_bfnt()は、BFNT+ Rev.1.6  で採用された透明色
        の拡張ヘッダに対応しています。
         BFNT+  ファイルに透明色の拡張ヘッダが含まれていない場合
        には、デフォルトで color 0 が透明色となりますが、拡張ヘッ
        ダで指定するとこれを異なる色に変更することができます。
         また、BFNT+ Rev.1.6 では、 複数の透明色が認められていま
        すが、 master.libでは最初に出てくる透明色の拡張ヘッダにし
        か対応していません。

         下位関数の実行は、必ず以下の順序を守ってください。

        ・BFNT+(16色)パターンを読み込む場合
        1.  fontfile_open() (または dos_ropen())
        2.  bfnt_header_read()
        3.  bfnt_extend_header_analysis()  または
bfnt_extend_header_skip()
        4.  bfnt_palette_set() または bfnt_palette_skip()
        5.  bfnt_entry_pat()
        6.  fontfile_close() (または dos_close())

        ・BFNT(2色)ファイルから消去パターンを読み込む場合
        1.  fontfile_open() (または dos_ropen())
        2.  bfnt_header_read()
        3.  bfnt_change_erase_pat()
        4.  fontfile_close() (または dos_close())

------------------------------------------------------------------------
□ 構造体/グローバル変数

         下位関数で用いる BfntHeader 構造体は、 以下のようになっ
        ています。

typedef struct BfntHeader BfntHeader;
struct BfntHeader {
   unsigned char id[5], col;   "BFNT\x1a", 色数
   unsigned char ver, x00;     バージョン,0
   unsigned int Xdots;         横ドット数
   unsigned int Ydots;         縦ドット数
   unsigned int START;         開始キャラクタ番号
   unsigned int END;            終了キャラクタ番号
   unsigned char font_name[8];  フォント名
   unsigned long time;          作成時刻
   unsigned int extSize;        拡張ヘッダサイズ
   unsigned int hdrSize;        ヘッダサイズ
};

------------------------------------------------------------------------
□ bfnt_change_erase_pat - (低)BFNTファイルから消去パターンを設定

C:      int bfnt_change_erase_pat(int patnum, int handle, BfntHeader *header);

        ------------------------------------------98N 98H AT DOS-
        bfnt_change_erase_pat                                ○
        -------------------------------------------

                ● BFNT(2色)ファイルから、 patnum以降の登録済みパ
                   ターンの消去パターンを一括再設定します。

                ← patnum  消去パターンを再設定する最初の登録済み
                           パターン番号
                   handle  読み込みオープンされたファイルハンドル
                   header  すでに読み込まれた BFNT+ヘッダ

                → NoError             成功
                   InvalidData         フォントファイルが使えない
                                       規格である
                   InsufficientMemory  パターンを一時的に読み込む
                                       メモリが足りない

                ★ BFNT ファイルは 2色で、 登録済みパターンと全く
                   同じ大きさでなければなりません。

------------------------------------------------------------------------
□ bfnt_entry_pat - (低)BFNT+ファイルからパターンを登録

C:      int bfnt_entry_pat( int handle, BfntHeader *header, int color );

        ------------------------------------------98N 98H AT DOS-
        bfnt_entry_pat                                       ○
        -------------------------------------------

                ● BFNT+ファイルにかかれた全てのデータをパターン
                   として一括登録します。

                ← color  透明色(通常は 0)

                → NoError             成功
                   GeneralFailure      登録できるキャラクタ数を越
                                       えている
                   InvalidData         フォントファイルが使えない
                                       規格である
                   InsufficientMemory  パターンを登録する為のメモ
                                       リが足りない

                ★ BFNT+ ファイルは 16 色で、xdots が 8  の倍数か
                   つ 64 以下でなければなりません。
                ★ パターンの大きさと数は、headerをもとに自動設定
                   します。
                ★ InsufficientMemory が返ったら、 登録途中のまま
                   のメモリを開放しません。
                ★ ファイルポインタは、データの先頭でなければなり
                   ません。(bfnt_header_read でヘッダを読み込み、
                   拡張ヘッダ、パレットデータがあればそれぞれの大
                   きさだけ進んだ位置)

------------------------------------------------------------------------
□ bfnt_extend_header_analysis - (低)BFNT+ファイルから透明色を得る

C:      int bfnt_extend_header_analysis( int handle, BfntHeader *header );

        ------------------------------------------98N 98H AT DOS-
        bfnt_extend_header_analysis                          ○
        -------------------------------------------

                ● ファイルの拡張ヘッダを読み込み、最初に見つかっ
                   た透明色を返します。

                → 0-15                透明色(透明色の拡張ヘッダ
                                       がないときも 0 を返す)
                   InsufficientMemory  拡張ヘッダを読込む為のメモ
                                       リが足りない
                   InvalidData         拡張ヘッダが読み込めない

                ★ ファイルポインタは、bfnt_header_read()の直後の
                   状態(先頭から32バイトの位置)でなければなりませ
                   ん。
                ★ 実行後、ファイルポインタは拡張ヘッダの末尾の次
                   の位置に移動します。

------------------------------------------------------------------------
□ bfnt_extend_header_skip - (低)BFNT+ファイルの拡張ヘッダを飛ばす

C:      int bfnt_extend_header_skip( int handle, BfntHeader *header );

        ------------------------------------------98N 98H AT DOS-
        bfnt_extend_header_skip                              ○
        -------------------------------------------

                ● ファイルポインタを、 BFNT+の(拡張)ヘッダ末尾の
                   次の位置に移動します。

                → NoError      成功
                   InvalidData  seek失敗

                ★ ファイルポインタは、bfnt_header_read()の直後の
                   状態(先頭から32バイトの位置)でなければなりませ
                   ん。

------------------------------------------------------------------------
□ bfnt_header_load - BFNT/BFNT+ファイルのヘッダを読む

C:      int bfnt_header_load( const char *filename, BfntHeader *header );

        ------------------------------------------98N 98H AT DOS-
        bfnt_header_load                                     ○
        -------------------------------------------

                ● BFNT/BFNT+ファイルのヘッダ部分だけを読み込みま
                   す。ただし、そのバイト数を構造体に入れるだけで、
                   何の検査もしていません。

                ← filename  ファイル名
                   header    読み込み先の構造体のアドレス

                → NoError       成功
                   FileNotFound  指定された BFNT ファイルがオープ
                                 ンできない

------------------------------------------------------------------------
□ bfnt_header_read - (低)BFNT+ファイルのヘッダを読む

C:      int bfnt_header_read( int handle, BfntHeader *header );

        ------------------------------------------98N 98H AT DOS-
        bfnt_header_read                                     ○
        -------------------------------------------

                ● BFNT/BFNT+ファイルであることを検査したあと、フ
                   ァイルからヘッダを読み込みます。

                → NoError      成功
                   InvalidData  指定されたファイルは   BFNT/BFNT+
                                形式でない

                ★ ファイルポインタは、BFNT/BFNT+  ファイルの先頭
                   を示している必要があります。通常、
                   fontfile_open()の実行直後の状態で呼び出して下
                   さい。

------------------------------------------------------------------------
□ bfnt_palette_set - (低)BFNT+ファイルからパレット情報を読む

C:      int bfnt_palette_set( int handle, BfntHeader *header );

        ------------------------------------------98N 98H AT DOS-
        bfnt_palette_set                                     ○
        -------------------------------------------

                ● BFNT+ファイルからパレット情報を読み出してグロ
                   ーバル変数 Palettes に設定します。

                → NoError             成功
                   InvalidData         パレット情報が存在しないか、
                                       読み込めない

                ★ パレット情報は 16 色でなければなりません。
                ★ ファイルポインタは、BFNT/BFNT+  ファイルのパレ
                   ット情報の先頭を示している必要がります。 (拡張
                   ヘッダのない場合には、bfnt_header_read()の実行
                   直後、拡張ヘッダのある場合には、
                   bfnt_extend_header_skip()、
                   bfnt_extend_header_analysis()の実行直後の状態)。

------------------------------------------------------------------------
□ bfnt_palette_skip - (低)BFNT+ファイルのパレット情報を無視する

C:      int bfnt_palette_skip( int handle, BfntHeader *header );

        ------------------------------------------98N 98H AT DOS-
        bfnt_palette_skip                                    ○
        -------------------------------------------

                ● ファイルポインタを、パレット情報を読み飛ばした
                   位置まで進めます。

                → NoError             成功
                   InvalidData         パレット情報が存在しないか、
                                       読み込めない

                ★ ファイルポインタは、BFNT/BFNT+  ファイルのパレ
                   ット情報の先頭を示している必要がります。
                   (拡張ヘッダのない場合には bfnt_header_read()の
                   実行直後の状態、
                   ある場合には bfnt_extend_header_skip()、
                   bfnt_extend_header_analysis()実行直後の状態)

------------------------------------------------------------------------
□ fontfile_close - (低)BFNT+ファイルを閉じる

C:      int fontfile_close( int handle );

        ------------------------------------------98N 98H AT DOS-
        fontfile_close                                       ○
        -------------------------------------------

                ● ファイルを閉じます。

                ← handle ファイルハンドル

                → NoError     成功
                   InvalidData 指定されたファイルがクローズできな
                   い

                ★ dos_closeの別名です。

------------------------------------------------------------------------
□ fontfile_open - (低)BFNT+ファイルを開く

C:      int fontfile_open( const char *filename );

        ------------------------------------------98N 98H AT DOS-
        fontfile_open                                        ○
        -------------------------------------------

                ● ファイルを読み込みオープンします。

                → FileNotFound  オープン失敗
                   それ以外      ファイルハンドル

                ★ dos_ropenの別名です。

------------------------------------------------------------------------
□ super_change_erase_bfnt - (高)BFNTファイルから消去パターンを一括設定

C:      int super_change_erase_bfnt( int patnum, const char *filename );

        ------------------------------------------98N 98H AT DOS-
        super_change_erase_bfnt                              ○
        -------------------------------------------

                ● BFNTファイルを読み込み、指定番号のパターンから
                   ファイルに格納されているすべてのデータで消去パ
                   ターンを再設定します。

                ← patnum    変更される最初の登録されているパター
                             ン番号
                   filename  BFNTファイル名

                → NoError       成功
                   FileNotFound  指定された BFNT ファイルがオープ
                                 ンできない
                   InvalidData   フォントファイルが使えない規格で
                                 ある

                ★ BFNTファイルは 2色で、登録済みパターンと全く同
                   じ大きさある必要があります。

------------------------------------------------------------------------
□ super_entry_bfnt - (高)BFNT+ファイルからパターンに一括登録

C:      int super_entry_bfnt( const char *filename );

        ------------------------------------------98N 98H AT DOS-
        super_entry_bfnt                                     ○
        -------------------------------------------

                ● BFNT+ファイルを読み込み、 すべてのデータをパタ
                   ーンとして一括登録し、パレット情報があれば
                   Palettes に読み込みます。

                ← BFNT+ファイル名 (16色で xdotsが8の倍数で64以下
                   でなければなりません)

                → 1~511              登録したパターン数
                   GeneralFailure      登録できるキャラクタ数を越
                                       えている
                   FileNotFound        指定された BFNT ファイルが
                                       オープンできない
                   InvalidData         フォントファイルが使えない
                                       規格である(16色でない場合
                                       も含む)
                   InsufficientMemory  パターンを登録する為のメモ
                                       リが足りない

                ★ パターンの大きさおよび数は、 BFNT+ファイルから
                   自動的に設定します。
                ★ 戻り値は登録したパターン数であり、パターン番号
                   ではありません。
                ★ 登録の途中でメモリが足りなくなった場合には、登
                   録を中断してInsufficientMemory  を返しますが、
                   パターンは途中まで登録されたままです(メモリを
                   解放しない)。

                △MEMORY:  パターンを格納するためにメモリを確保し
                  ます。実際の大きさは、パターンの数だけ
                  super_entry_pat()で確保するので、そちらを参照し
                  てください。


------------------------------------------------------------------------
■ パターンの調査 ■■■■■■■■■■■■■■■■■■■■■■■■■■■

        登録済みのパターンを調べるためのマクロ群です。

------------------------------------------------------------------------
□ super_check_entry - パターンの存在検査

C:      int super_check_entry( int num );                  マクロ

        ------------------------------------------98N 98H AT DOS-
        super_check_entry
        -----------------------------------------------------<->-

                ● 番号 num  のパターンが登録されているかどうかを
                   判定します。

                → 0      登録されていない
                   0以外  登録されている

------------------------------------------------------------------------
□ super_getsize_pat - パターンの大きさを得る

C:      int super_getsize_pat( int num );                  マクロ

        ------------------------------------------98N 98H AT DOS-
        super_getsize_pat
        -----------------------------------------------------<->-

                ● 番号 num のパターンの大きさを得ます。

                → 0x0101 ~ 0x1080  パターンの大きさ

                ★ 得られるサイズは、super_entry_pat() で指定する
                   size と同じ値で、上位 8 ビットが xdots / 8、下
                   位 8 ビットが ydots です。

------------------------------------------------------------------------
□ super_getsize_pat_x - パターンの幅を得る

C:      int super_getsize_pat_x( int num );                マクロ

        ------------------------------------------98N 98H AT DOS-
        super_getsize_pat_x
        -----------------------------------------------------<->-

                ● 番号 num のパターンの xdots を得ます。

                → 8 ~ 128  パターンの横ドット数(xdots)

------------------------------------------------------------------------
□ super_getsize_pat_y - パターンの高さを得る

C:      int super_getsize_pat_y( int num );                マクロ

        ------------------------------------------98N 98H AT DOS-
        super_getsize_pat_y
        -----------------------------------------------------<->-

                ● 番号 num のパターンの ydots を得ます。

                → 1 ~ 128  パターンの縦ドット数(ydots)


------------------------------------------------------------------------
■ パターンの表示(super_put系) ■■■■■■■■■■■■■■■■■■■■

         super_put() 系の関数は、パターンの表示/消去を行います。

         super_put() 系の関数は、 パターンを表示する際に背景を待
        避しないため、 パターンを消去するには工夫が必要です。その
        方法としては以下のようなものが考えられます。

         ・背景を裏ページに保存
         ・パターンの上に背景を再描画
         ・背景を仮想VRAMに保存

         最初の方法は『蟹味噌』等で使われた方法ですが、 二画面切
        り換えができなくなるためちらつきが発生してしまいます。 こ
        の方法を実現している関数が super_repair() と repair_back()
        です。

         二番目の方法は alty氏の『か~に』等で使われています。背
        景をパターンで描画している場合には有効です。しかし、 これ
        を実現するための関数は特別には用意されていません。
        over_put_8() 等で背景を描画するか、自前の関数を使う必要が
        あります。

         三番目の方法については仮想VRAM系の項で説明します。

         roll 系の関数はスクロールゲーム等に使用すると便利です。

------------------------------------------------------------------------
□ repair_back, vga4_repair_back - パターンを裏画面の絵で消去(8dot単位)

C:      void repair_back( int x, int y, int num );
C:      void vga4_repair_back( int x, int y, int num );    マクロ

        ------------------------------------------98N 98H AT DOS-
        repair_back                                V  × *
        ---------------------------------------------
        vga4_repair_back                           ×  × V
        -----------------------------------------------------<->-

                ● 左上座標が  (x,   y)の位置に表示されている番号
                   num のパターンを1ページの背景で消去します。

                ★ クリッピングは行っていません。
                ★ あらかじめ 0ページと同じ背景を 1ページにも描画
                   または転送しておく必要があります。転送は
                   graph_copy_page() 関数を利用すれば簡単です。
                ★ X 方向は 8  ドット単位で消去されてしまうので、
                   同一バイト上に表示されているパターンは一緒に消
                   去されます。
                ★ 高速形式で表示されたものでも消去できます。
                ★ super_repair() 関数よりも高速です。

------------------------------------------------------------------------
□ slice_put - パターンの指定ラインを表示(8dot単位)

C:      void slice_put( int x, int y, int num, int line );

        ------------------------------------------98N 98H AT DOS-
        slice_put                                  V  × ×
        -------------------------------------------

                ● 左上座標が((x &~7), y)の位置に、番号 num  のパ
                   ターンの line 行目だけを上書き表示します。

                ★ クリッピングは行っていません。

------------------------------------------------------------------------
□ super_put, vga4_super_put - パターンの表示

C:      void super_put( int x, int y, int num );
C:      void vga4_super_put(int x, int y, int num);

        ------------------------------------------98N 98H AT DOS-
        super_put                                  V  × *
        -------------------------------------------
        vga4_super_put                             ×  × ○
        -------------------------------------------

                ● 左上座標が(x, y)の位置に、番号 num  のパターン
                   を表示します。

                ★ クリッピングは行っていません。

------------------------------------------------------------------------
□ super_put_8, vga4_super_put_8 - パターンの表示(8dot単位)

C:      void super_put_8( int x, int y, int num );
C:      void vga4_super_put_8(int x, int y, int num);

        ------------------------------------------98N 98H AT DOS-
        super_put_8                                V  × *
        -------------------------------------------
        vga4_super_put_8                           ×  × ○
        -------------------------------------------

                ● 左上座標が(x, y)の位置に、番号 num  のパターン
                   を表示します。

                ○ xは8の倍数に切り捨てられます。

                ★ クリッピングは行っていません。
                ★ シフトが不要のため、super_put() 関数よりも高速
                   です。

------------------------------------------------------------------------
□ super_put_clip, vga4_super_put_clip - パターンの表示(y clip)

C:      void super_put_clip( int x, int y, int num );
C:      void vga4_super_put_clip(int x, int y, int num);

        ------------------------------------------98N 98H AT DOS-
        super_put_clip                             V  × *
        -------------------------------------------
        vga4_super_put_clip                        ×  × V
        -------------------------------------------

                ● 左上座標が(x, y)の位置に、番号 num  のパターン
                   を表示します。

                ★ <98>Y 方向のみ 400line  でクリッピングを行って
                   います。
                ★ Y 方向のみ画面の大きさでクリッピングを行っ
                   ています。

------------------------------------------------------------------------
□ super_put_clip_8 - パターンの表示(y clip, 8dot単位)

C:      void super_put_clip_8( int x, int y, int num );

        ------------------------------------------98N 98H AT DOS-
        super_put_clip_8                           V  × ×
        -------------------------------------------

                ● 左上座標が(x, y)の位置に、番号 num  のパターン
                   を表示します。

                ★ Y 方向のみ 400line  でクリッピングを行っていま
                   す。
                ★ X 方向の指定は 8 ドット単位です。 その間を指定
                   した場合には下位  3 ビットが切り捨てられた位置
                   になります。
                ★ シフトが不要のため、super_put_clip()関数よりも
                   高速です。

------------------------------------------------------------------------
□ super_put_tiny - 16xndotパターンの高速表示

C:      void super_put_tiny(  int x, int y, int num );

        ------------------------------------------98N 98H AT DOS-
        super_put_tiny                             V  × ×
        -------------------------------------------

                ● 左上座標が(x, y)の位置に、番号 num の横幅16dot
                   のパターンを表示します。

                ★ クリッピングは行っていません。
                ★ この関数で表示するには、  パターンデータ形式を
                   super_convert_tiny  によって正常に変更されてい
                   なければなりません。

                ★ パターンの横の大きさが 16dot以外であれば、異常
                   なパターンが表示されます。

------------------------------------------------------------------------
□ super_put_tiny_small - 8xndotパターンの高速表示

C:      void super_put_tiny_small(  int x, int y, int num );

        ------------------------------------------98N 98H AT DOS-
        super_put_tiny_small                       V  × ×
        -------------------------------------------

                ● 左上座標が(x, y)の位置に、番号 num の  8xndot
                   パターンを表示します。

                ★ クリッピングは行っていません。
                ★ パターンの縦ドット数nは偶数でなければいけませ
                   ん。
                ★ この関数で表示するには、  パターンデータ形式を
                   super_convert_tiny  によって正常に変更されてい
                   なければなりません。

                ★ パターンの大きさが 8xndot以外であれば、異常な
                   パターンが表示されます。

------------------------------------------------------------------------
□ super_put_tiny_small_vrev - 8xndotパターンの高速表示(上下反転)

C:      void super_put_tiny_small_vrev(  int x, int y, int num );

        ------------------------------------------98N 98H AT DOS-
        super_put_tiny_small_vrev                  V  × ×
        -------------------------------------------

                ● 左上座標が(x, y)の位置に、番号 num の  8xndot
                   パターンを上下逆さに表示します。

                ★ クリッピングは行っていません。
                ★ パターンの縦ドット数nは偶数でなければいけませ
                   ん。
                ★ この関数で表示するには、  パターンデータ形式を
                   super_convert_tiny  によって正常に変更されてい
                   なければなりません。

                ★ パターンの大きさが 8xndot以外であれば、異常な
                   パターンが表示されます。

------------------------------------------------------------------------
□ super_put_tiny_vrev - 16xndotパターンの高速表示(上下反転)

C:      void super_put_tiny_vrev(  int x, int y, int num );

        ------------------------------------------98N 98H AT DOS-
        super_put_tiny_vrev                        V  × ×
        -------------------------------------------

                ● 左上座標が(x, y)の位置に、番号 num の横幅16dot
                   のパターンを上下逆さに表示します。

                ★ クリッピングは行っていません。
                ★ この関数で表示するには、  パターンデータ形式を
                   super_convert_tiny  によって正常に変更されてい
                   なければなりません。

                ★ パターンの横の大きさが 16dot以外であれば、異常
                   なパターンが表示されます。

------------------------------------------------------------------------
□ super_put_vrev, vga4_super_put_vrev - パターンの表示(上下反転)

C:      void super_put_vrev( int x, int y, int num );
C:      void vga4_super_put_vrev(int x, int y, int num);

        ------------------------------------------98N 98H AT DOS-
        super_put_vrev                             V  × *
        -------------------------------------------
        vga4_super_put_vrev                        ×  × V
        -------------------------------------------

                ● 左上座標が(x, y)の位置に、番号 num  のパターン
                   を上下逆転して表示します。画面下端を越えた部分
                   は上端から出てきます。

                ★ クリッピングは行っていません。

------------------------------------------------------------------------
□ super_repair - パターンを裏画面の絵で消去

C:      void super_repair( int x, int y, int num );

        ------------------------------------------98N 98H AT DOS-
        super_repair                               V  × ×
        -------------------------------------------

                ● 左上座標が  (x,   y)の位置に表示されている番号
                   num のパターンを1ページの背景で消去します。

                ★ クリッピングは行っていません。
                ★ あらかじめ 0ページと同じ背景を 1ページにも描画
                   または転送しておく必要があります。転送は
                   graph_copy_page() 関数を利用すれば簡単です。
                ★ 高速形式で表示されたものは消去できません。

------------------------------------------------------------------------
□ super_roll_put, vga4_super_roll_put - パターンの表示(画面上下接続)

C:      void super_roll_put( int x, int y, int num );
C:      void vga4_super_roll_put(int x, int y, int num);

        ------------------------------------------98N 98H AT DOS-
        super_roll_put                             V  × *
        -------------------------------------------
        vga4_super_roll_put                        ×  × V
        -------------------------------------------

                ● 左上座標が(x, y)の位置に、番号 num  のパターン
                   を表示します。画面下端を越えた部分は上端から出
                   てきます。

                ★ クリッピングは行っていません。
                ★ 引数 y は、0 ≦ y < graph_VramLines の範囲内に
                   なければなりません。
                   <98> 0 ≦ y < 400 固定です。

------------------------------------------------------------------------
□ super_roll_put_8 - パターンの表示(画面上下接続, 8dot単位)

C:      void super_roll_put_8( int x, int y, int num );

        ------------------------------------------98N 98H AT DOS-
        super_roll_put_8                           V  × ×
        -------------------------------------------

                ● 左上座標が(x, y)の位置に、番号 num  のパターン
                   を表示します。画面下端を越えた部分は上端から出
                   てきます。

                ○ xは8の倍数に切り捨てられます。

------------------------------------------------------------------------
□ super_roll_put_tiny - 16x16dotパターンの高速表示(画面上下接続)

C:      void super_roll_put_tiny(  int x, int y, int num );

        ------------------------------------------98N 98H AT DOS-
        super_roll_put_tiny                        V  × ×
        -------------------------------------------

                ● 左上座標が(x, y)の位置に、番号 num の 16x16dot
                   パターンを表示します。

                ★ クリッピングは行っていません。
                ★ この関数で表示するには、  パターンデータ形式を
                   super_convert_tiny  によって正常に変更されてい
                   なければなりません。

                ★ パターンの Y 方向 400 ラインを越えて表示しよう
                   とした部分は 0 ライン以降に表示します。

                ★ 引数 y は、0 ≦ y ≦ 399  の範囲内になければな
                   りません。

                ★ パターンの大きさが 16x16dot以外であれば、 異常
                   なパターンが表示されます。


------------------------------------------------------------------------
■ キャラクタの表示(super_in系) ■■■■■■■■■■■■■■■■■■■■

         super_in() 系の関数は、キャラクタの表示/消去を行います。

         キャラクタを表示する際に背景を保存しているので、 複数の
        キャラクタ消去する際には、 消去する順番に気をつける必要が
        あります。通常の使用では後に表示したものから順に(表示の順
        の反対)消去していれば問題ありません。

         それぞれのキャラクタには、1回分の背景保存バッファしかな
        いので、 同一番号のキャラクタを二ヶ所以上に表示すると正常
        な消去ができなくなります。二画面切り替えをする場合には、0
        ページ用と1ページ用の二つのキャラクタが必要となるので注意
        してください。

------------------------------------------------------------------------
□ repair_out, vga4_repair_out - キャラクタの除去(8dot単位)

C:      void repair_out( int x, int y, int num );
C:      void vga4_repair_out(int x, int y, int num);

        ------------------------------------------98N 98H AT DOS-
        repair_out                                 V  × *
        ---------------------------------------------
        vga4_repair_out                            ×  × ○
        -------------------------------------------

                ● 左上座標が  (x,   y)の位置に表示されている番号
                   num のキャラクタを消去します。

                ★ クリッピングは行っていません。
                ★ X 方向は 8  ドット単位で消去されてしまうので、
                   同一バイト上に表示されているパターンは一緒に消
                   去されます。
                ★ super_out() 関数よりも高速です。

------------------------------------------------------------------------
□ super_in, vga4_super_in - キャラクタの表示

C:      void super_in( int x, int y, int num );
C:      void vga4_super_in(int x, int y, int num);

        ------------------------------------------98N 98H AT DOS-
        super_in                                   V  × *
        --------------------------------------------
        vga4_super_in                              ×  × ○
        --------------------------------------------

                ● 左上座標が(x, y)の位置に、番号 num  のキャラク
                   タを表示します。

                ★ クリッピングは行っていません。

------------------------------------------------------------------------
□ super_out - キャラクタの除去

C:      void super_out( int x, int y, int num );

        ------------------------------------------98N 98H AT DOS-
        super_out                                  V  × ×
        -------------------------------------------

                ● 左上座標が  (x,   y)の位置に表示されている番号
                   num のキャラクタを消去します。

                ★ クリッピングは行っていません。


------------------------------------------------------------------------
■ 仮想VRAM系 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

         仮想VRAM系の関数は、super_put()  系の関数で表示されたパ
        ターンを仮想VRAMに保存されている背景で消去します。

         仮想VRAMとしてメインメモリを 128KB(640x400の場合)  消費
        しますが、 メモリに余裕がある場合には、最も高速に二画面切
        り替えを行うことができます。

         背景を仮想VRAMに転送する必要があるので、 スクロールゲー
        ムには適しません。

------------------------------------------------------------------------
□ 構造体/グローバル変数

unsigned virtual_seg;           仮想VRAMの先頭セグメントアドレス
                                (0=未確保)

------------------------------------------------------------------------
□ virtual_copy, vga4_virtual_copy - 仮想VRAMの確保と実画面からの転送

C:      int virtual_copy(void);
C:      int vga4_virtual_copy(void);

        ------------------------------------------98N 98H AT DOS-
        virtual_copy                               V  × * ○
        --------------------------------------------
        vga4_virtual_copy                          ×  × V
        -------------------------------------------

                ● 仮想VRAMを確保して、グラフィック VRAM のアクテ
                   ィブページを確保した仮想VRAMにコピーします。
                ● 実画面(graph_VramWords*4ワード)と同じ大き
                   さの仮想VRAMを確保し、実画面の内容で埋めます。

                → NoError             成功
                   InsufficientMemory  仮想VRAMの為のメモリが足り
                                       ない

                ★ 仮想VRAMを確保するのは最初に呼び出された時だけ
                   です。
                ★ 二度目以降は virtual_vram_copy()  関数を呼ぶと
                   少し速いかな??

                ○ 仮想VRAMのために確保したメモリを開放するには、
                   virtual_free()を利用してください。

                △MEMORY: graph_VramWords/2  パラグラフ(640x400時
                  は8000パラグラフ)のブロックを確保します。

------------------------------------------------------------------------
□ virtual_free - 仮想VRAMの開放

C:      void virtual_free(void);

        ------------------------------------------98N 98H AT DOS-
        virtual_free
        --------------------------------------------

                ● 仮想VRAMに使用していたメモリを開放します。

                △MEMORY:  仮想VRAMに使用していたメモリを開放しま
                  す。

------------------------------------------------------------------------
□ virtual_repair, vga4_virtual_repair - 仮想VRAMから実画面へ転送

C:      void virtual_repair( int x, int y, int num );
C:      void vga4_virtual_repair(int x, int y, int num);

        ------------------------------------------98N 98H AT DOS-
        virtual_repair                             V  × *
        ---------------------------------------------
        vga4_virtual_repair                        ×  × V
        --------------------------------------------

                ● 左上座標が  (x,   y)の位置に表示されている番号
                   num のパターンを仮想VRAMの背景で消去します。

                ★ クリッピングは行っていません。
                ★ あらかじめアクティブページ用の背景を仮想VRAMに
                   も転送しておく必要があります。転送は
                   virtual_copy() または vga4_virtual_copy() 関数
                   で行います。
                ★ X 方向は 8  ドット単位で消去されてしまうので、
                   同一バイト上に表示されているパターンは一緒に消
                   去されます。
                ★ 高速形式で表示されたものでも消去できます。

------------------------------------------------------------------------
□ virtual_vram_copy, vga4_virtual_vram_copy -  実画面を仮想VRAMに転送す
   る

C:      void virtual_vram_copy(void);
C:      void vga4_virtual_vram_copy(void);

        ------------------------------------------98N 98H AT DOS-
        virtual_vram_copy                          V  × *
        --------------------------------------------
        vga4_virtual_vram_copy                     ×  × V
        -------------------------------------------

                ● グラフィック VRAM のアクティブページを、確保し
                   た仮想VRAMにコピーします。

                ★ 仮想VRAMは、virtual_copy() または
                   vga4_virtual_copy() 関数により確保済みでなけれ
                   ばなりません。


------------------------------------------------------------------------
■ plane系 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

         plane系の関数は、プレーンを分離して処理を行う関数群です。
        この関数群を利用すれば色違いのパターンも実現できます。

------------------------------------------------------------------------
□ super_roll_put_1plane - パターンを指定プレーンに表示(画面上下接続)

C:      void super_roll_put_1plane( int x, int y, int num,
                                   int pattern_plane, unsigned put_plane );

        ------------------------------------------98N 98H AT DOS-
        super_roll_put_1plane                      V  × ×
        -------------------------------------------

                ● 左上座標が (x, y) の位置に、番号 num  のパター
                   ンのpattern_plane プレーンのパターンを、
                   put_plane プレーンに表示します。

                ★ パターンの Y 方向 400 ラインを越えて表示しよう
                   とした部分は 0 ライン以降に表示します。
                ★ 引数 y は、0 ≦ y ≦ 399  の範囲内になければな
                   りません。

                ★ pattern_plane、put_plane の指定は、
                   super_put_1plane() の項を参照してください。

------------------------------------------------------------------------
□ super_roll_put_1plane_8 - パターンを指定プレーンに表示(8dot単位, 画面
   上下接続)

C:      void super_roll_put_1plane_8( int x, int y, int num,
                                     int pattern_plane, unsigned put_plane );

        ------------------------------------------98N 98H AT DOS-
        super_roll_put_1plane_8                    V  × ×
        -------------------------------------------

                ● 左上座標が (x, y) の位置に、番号 num  のパター
                   ンの pattern_plane プレーンのパターンを、
                   put_plane プレーンに表示します。画面下端を越え
                   た部分は上端から出てきます。

                ○ xは8の倍数に切り捨てられます。

                ★ 引数 y は、0 ≦ y ≦ 399  の範囲内になければな
                   りません。
                ★ pattern_plane、put_plane の指定は、
                   super_put_1plane() の項を参照してください。

------------------------------------------------------------------------
□ super_put_1plane, vga4_super_put_1plane -  パターンを指定プレーンに表
   示

C:      void super_put_1plane( int x, int y, int num,
                              int pattern_plane, unsigned put_plane );
C:      void vga4_super_put_1plane( int x, int y,  int  num,  int
                                   pattern_plane, unsigned
                                   put_plane );

        ------------------------------------------98N 98H AT DOS-
        super_put_1plane                           V  × *
        -------------------------------------------
        vga4_super_put_1plane                      ×  × V
        -------------------------------------------

                ● 左上座標が (x, y) の位置に、番号 num  のパター
                   ンの pattern_plane プレーンのパターンを、
                   put_plane プレーンに表示します。

                ★ クリッピングは行っていません。

                    ・pattern_plane の指定は
                        パターン(消去)  PATTERN_ERASE 0
                        パターン(青)    PATTERN_BLUE  1
                        パターン(赤)    PATTERN_RED   2
                        パターン(緑)    PATTERN_GREEN 3
                        パターン(輝度)  PATTERN_INTEN 4
                      の中から選択します。

                    ・put_plane の指定は
                        全プレーン消去  PLANE_ERASE 0x00c0
                        プレーン(青)    PLANE_BLUE  0xffce
                        プレーン(赤)    PLANE_RED   0xffcd
                        プレーン(緑)    PLANE_GREEN 0xffcb
                        プレーン(輝度)  PLANE_INTEN 0xffc7
                      の中から選択します。 マクロとして定義されて
                      はいませんが、GRCG に送るデータを引数に直接
                      指定することで、 任意のプレーンの消去や複数
                      のプレーンへの描画ができます。

------------------------------------------------------------------------
□ super_put_1plane_8, vga4_super_put_1plane_8 -  パターンを指定プレーン
   に表示(8dot単位)

C:      void super_put_1plane_8( int x, int y, int num,
                                int pattern_plane, unsigned put_plane );
C:      void vga4_super_put_1plane_8( int x, int y, int num,  int
                                     pattern_plane, unsigned
                                     put_plane );

        ------------------------------------------98N 98H AT DOS-
        super_put_1plane_8                         V  × *
        -------------------------------------------
        vga4_super_put_1plane_8                    ×  × V
        -------------------------------------------

                ● 左上座標が (x, y) の位置に、番号 num  のパター
                   ンの pattern_plane プレーンのパターンを、
                   put_plane プレーンに表示します。

                ○ xは8の倍数に切り捨てられます。

                ★ クリッピングは行っていません。
                ★ pattern_plane、put_plane の指定は、
                   super_put_1plane() の項を参照してください。


------------------------------------------------------------------------
■ window系 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

         window系の関数は、 クリッピングの範囲が変更できる  clip
        系の関数と考えることができます。

         パターンを表示する範囲を window と呼びます。

------------------------------------------------------------------------
□ super_put_rect, vga4_super_put_rect - 枠クリッピング型パターン表示

C:      void super_put_rect( int x, int y, int num );
C:      void vga4_super_put_rect(int x, int y, int num);

        ------------------------------------------98N 98H AT DOS-
        super_put_rect                             V  × *
        -------------------------------------------
        vga4_super_put_rect                        ×  × V
        -------------------------------------------

                ● super_put を grc_setclip範囲でクリッピングを行
                   うようにしたものです。

------------------------------------------------------------------------
□ super_put_vrev_rect, vga4_super_put_vrev_rect -  枠クリッピング型パタ
   ーン表示(上下反転)

C:      void super_put_vrev_rect( int x, int y, int num );
C:      void vga4_super_put_vrev_rect(int x, int y, int num);

        ------------------------------------------98N 98H AT DOS-
        super_put_vrev_rect                        V  × *
        -------------------------------------------
        vga4_super_put_vrev_rect                   ×  × V
        -------------------------------------------

                ● super_put_vrev を  grc_setclip範囲でクリッピン
                   グを行うようにしたものです。

------------------------------------------------------------------------
□ super_put_window - 上下クリップ枠に対応したパターン表示

C:      void super_put_window( int x, int y, int num );

        ------------------------------------------98N 98H AT DOS-
        super_put_window                           V  × ×
        ---------------------------------------------

                ● 左上座標が(x, y)の位置に、番号 num  のパターン
                   を表示します。

                ★ 上下端のみ、super_set_window  で指定された範囲
                   でクリッピングを行っています。

------------------------------------------------------------------------
□ super_set_window - 上下クリップ枠を設定する

C:      void super_set_window( int top, int bottom );

        ------------------------------------------98N 98H AT DOS-
        super_set_window                           V  × ×
        ---------------------------------------------

                ● window の上端を top に、下端を bottom に設定し
                   ます。

                ★ top および bottom は、0 ≦ top ≦  399、 0  ≦
                   bottom  ≦ 399 の範囲内で、top < bottom でなけ
                   ればなりません。
                ★ デフォルトは、top = 0、bottom = 399 です。


------------------------------------------------------------------------
■ over_put系 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

         over_put系の関数は、透明処理を行わずに上書きを行います。
        over_put_8() は super_put_8() の 4 / 5 倍以下の時間で実行
        されるので(推測値)、背景等の描画に有効です。

------------------------------------------------------------------------
□ over_put_8, vga4_over_put_8 - パターンの上書き(8dot単位)

C:      void over_put_8( int x, int y, int num );
C:      void vga4_over_put_8(int x, int y, int num);

        ------------------------------------------98N 98H AT DOS-
        over_put_8                                 V  × *
        -------------------------------------------
        vga4_over_put_8                            ×  × V
        -------------------------------------------

                ● 左上座標が(x, y)の位置に、番号 num  のパターン
                   を表示します。

                ○ xは8の倍数に切り捨てられます。

                ★ クリッピングは行っていません。

------------------------------------------------------------------------
□ over_roll_put_8, vga4_over_roll_put_8 - パターンの上書き(画面上下接続,
   8dot単位)

C:      void over_roll_put_8( int x, int y, int num );
C:      void vga4_over_roll_put_8(int x, int y, int num);

        ------------------------------------------98N 98H AT DOS-
        over_roll_put_8                            V  × *
        -------------------------------------------
        vga4_over_roll_put_8                       ×  × V
        -------------------------------------------

                ● 左上座標が(x, y)の位置に、番号 num  のパターン
                   を表示します。画面下にはみ出た部分は、上端から
                   続けます。

                ← x     0~(画面幅 - パターンの横幅)。 値は8の倍
                         数に切り捨てます。
                   y    表示位置 (0 ≦ y < graph_VramLines)
                        <98>graph_VramLinesではなく、 400ライン固
                        定です。
                   num  パターン番号


------------------------------------------------------------------------
■ 拡大/縮小/変形表示 ■■■■■■■■■■■■■■■■■■■■■■■■■

         パターンを変形などして表示します。
         拡大時、スムージング等は行っていないので、 大きく拡大す
        るとギザギザした感じ(モザイク)になります。

         縮小は、ドットを間引いて描画します。

         変形は、sinカーブ型ラスタスクロール風表示や、縦の拡大率
        をデータの縦1ラインごとに変化させてゆく表示を行います。

------------------------------------------------------------------------
□ over_small_put_8 - パターンの2分の1縮小表示(8dot単位)

C:      void over_small_put_8( int x, int y, int num );

        ------------------------------------------98N 98H AT DOS-
        over_small_put_8                           V  × ×
        -------------------------------------------

                ● 左上座標が (x, y) の位置に、番号 num  のパター
                   ンを 1 / 2 の大きさに縮小して表示します。

                ○ xは8の倍数に切り捨てられます。

                ★ 表示するパターンのサイズは、xdots は 16 の倍数、
                   ydots は 2 の倍数でなければなりません。
                ★ クリッピングは行っていません。

------------------------------------------------------------------------
□ super_large_put, vga4_super_large_put - パターンの2倍拡大表示

C:      void super_large_put( int x, int y, int num );
C:      void vga4_super_large_put(int x, int y, int num);

        ------------------------------------------98N 98H AT DOS-
        super_large_put                            V  × *
        -------------------------------------------
        vga4_super_large_put                       ×  × V
        -------------------------------------------

                ● 左上座標が (x, y) の位置に、番号 num  のパター
                   ンを 2 倍の大きさに拡大して表示します。

                ★ 倍率は 2 倍に固定されているが、super_zoom() 関
                   数より高速です。
                ★ クリッピングは行っていません。

------------------------------------------------------------------------
□ super_vibra_put, vga4_super_vibra_put -  パターンを縦方向に伸縮変形表
   示

C:      void super_vibra_put( int x, int y, int num, int len, int
                             ph);
C:      void vga4_super_vibra_put( int x, int y, int num, int len,
                                  int ph);

        ------------------------------------------98N 98H AT DOS-
        super_vibra_put                            V  × *
        -------------------------------------------
        vga4_super_vibra_put                       ×  × V
        -------------------------------------------

                ● 左上座標が(x, y)の位置に、番号 num  のパターン
                   を、波長 len、位相 ph で縦方向に伸び縮みするよ
                   うに歪ませて表示します。
                    位相 ph を少しずつ変化させながら表示を繰返し
                   て、パターンを波打っているように見せるのが基本
                   的な使い方です。

                    表示速度は super_put() の1.5倍ぐらい遅い程度
                   です。

                ★ クリッピングは行っていません。
                ★ パターンの yドット数は64dotまでです。
                ★ 波長 len : 1~?[dot]
                   位相 ph  : -32768~32767[一周を256とする角度単
                            位]
                   これらの値はチェックしていません。
                   波長に 0を指定するとゼロ除算エラーが発生します。

------------------------------------------------------------------------
□ super_vibra_put_1plane - パターンを縦方向に揺らして表示(指定プレーン)

C:      void super_vibra_put_1plane( int x, int y, int  num,  int
                                    len, int ph, int
                                    pattern_plane, unsigned
                                    put_plane);

        ------------------------------------------98N 98H AT DOS-
        super_vibra_put_1plane                     V  × ×
        -------------------------------------------

                ● 左上座標が(x, y)の位置に、番号 num  のパターン
                   の pattern_plane プレーンのパターンを
                   put_plane プレーンに、波長 len、位相 ph でバネ
                   が伸び縮みするように歪ませて表示します。
                    super_vibra_put() の plane系です。

------------------------------------------------------------------------
□ super_wave_put, vga4_super_wave_put - パターンを横方向に波状変形表示

C:      void super_wave_put( int x, int y, int num, int len, char
                            amp, int ph);
C:      void vga4_super_wave_put( int x, int y, int num, int len,
                                 char amp, int ph);

        ------------------------------------------98N 98H AT DOS-
        super_wave_put                             V  × *
        -------------------------------------------
        vga4_super_wave_put                        ×  × V
        -------------------------------------------

                ● 左上座標が(x, y)の位置に、番号 num  のパターン
                   を、波長 len、振幅 amp、位相 ph で横方向にうね
                   らせて表示します。
                    位相 ph を少しずつ変化させながら表示を繰返し
                   て、パターンを波打っているように見せるのが基本
                   的な使い方です。
                    パラメータをいろいろ調整するとおもしろい効果
                   が得られます。
                    例えば、波長 len を 2 や 3  とかの極端に小さ
                   い値にするとパターンが分身したように見えます。
                    表示速度は super_put() の1.5倍ぐらい遅い程度
                   です。

                ★ クリッピングは行っていません。
                ★ パターンのyドット数は 64dotまでです。
                ★ 波長 len : -32767~-1,1~32767[dot]
                   振幅 amp : -127~127[dot]
                   位相 ph  : -32768~32767[一周を256とする角度単
                            位]
                   これらの値はチェックしていません。
                   特に波長 lenに 0を指定するとゼロ除算エラーが発
                   生します。
                ★ 負の振幅では位相が反転します。
                ★ 負の波長では位相がライン毎に反転します。
                   実際の波長は絶対値となります。

------------------------------------------------------------------------
□ super_wave_put_1plane, vga4_super_wave_put_1plane -  パターンを横方向
   に波状変形表示(指定プレーン)

C:      void super_wave_put_1plane( int x, int y,  int  num,  int
                                   len,  char  amp,  int  ph, int
                                   pattern_plane, unsigned
                                   put_plane);
C:      void vga4_super_wave_put_1plane( int x, int y,  int  num,
                                        int len, char amp, int ph,
                                        int pattern_plane,
                                        unsigned put_plane);

        ------------------------------------------98N 98H AT DOS-
        super_wave_put_1plane                      V  × *
        -------------------------------------------
        vga4_super_wave_put_1plane                 ×  × V
        -------------------------------------------

                ● 左上座標が(x, y)の位置に、番号 num  のパターン
                   の pattern_plane プレーンのパターンを
                   put_plane プレーンに、波長 len、振幅 amp、位相
                   ph で横方向にうねらせて表示します。

                ★ super_wave_put() の plane系です。

------------------------------------------------------------------------
□ super_zoom, vga4_super_zoom - パターンの任意拡大表示

C:      void super_zoom( int x, int y, int num, int rate );
C:      void vga4_super_zoom(int x, int y, int num, int rate);

        ------------------------------------------98N 98H AT DOS-
        super_zoom                                 V  × *
        -------------------------------------------
        vga4_super_zoom                            ×  × V
        -------------------------------------------

                ● 左上座標が (x, y) の位置に、番号 num  のパター
                   ンを rate 倍の大きさに拡大して表示します。

                ★ super_change_erase_pat()、
                   super_change_erase_bfnt()、
                   bfnt_change_erase_pat() 関数による消去パターン
                   の変更には対応していません。
                ★ 透明色が color 0 以外のパターンを表示した場合、
                   透明色以外に color 0 も透明色となり、 背景が残
                   って表示されます。

------------------------------------------------------------------------
□ super_zoom_put, vga4_super_zoom_put - パターンの拡大/縮小表示

C:      void super_zoom_put( int x,  int  y,  int  num,  unsigned
                            x_rate, int y_rate);
C:      void vga4_super_zoom_put( int x, int y, int num, unsigned
                                 x_rate, int y_rate);

        ------------------------------------------98N 98H AT DOS-
        super_zoom_put                             V  × *
        -------------------------------------------
        vga4_super_zoom_put                        ×  × V
        -------------------------------------------

                ● 左上座標が(x, y)の位置に、番号 num  のパターン
                   を x方向に (x_rate / 256)倍、y方向に (y_rate /
                   256)倍に拡大または縮小して表示します。 拡大/縮
                   小の中心は(x, y)固定です。
                    y_rateが負の場合は、縦反転されたパターンを、
                   -y_rateとして表示します。このため、 x_rateは約
                   256倍までですが、y_rateは約128倍までしかできま
                   せん。
                    super_zoom() と異なるのは、縮小ができること、
                   倍率を 1/256単位で単位で指定できること、 x方向
                   とy方向の倍率を別々に指定できることです。
                    表示速度は super_zoom() よりわずかに遅い程度
                   です。とはいっても内部で grcg_boxfill() を使っ
                   て 1ドットずつ表示しているので super_put()  と
                   は比較にならないくらい低速です。

                ★ x_rate や y_rate には 0 を指定してはいけません。
                ★ 透明色について super_zoom() と同じ制限がありま
                   す。
                ○ grc_setclip範囲でクリッピングします。

------------------------------------------------------------------------
□ super_zoom_put_1plane - パターンの拡大/縮小表示(指定プレーン)

C:      void super_zoom_put_1plane(  int  x,  int  y,  int   num,
                                   unsigned x_rate, unsigned
                                   y_rate,   int   pattern_plane,
                                   unsigned put_plane);

        ------------------------------------------98N 98H AT DOS-
        super_zoom_put_1plane                      V  × ×
        -------------------------------------------

                ● 左上座標が(x, y)の位置に、番号 num  のパターン
                   の  pattern_plane プレーンのパターンを x方向に
                   (x_rate / 256)倍、y方向に (y_rate / 256)倍に拡
                   大または縮小して表示します。
                    要するに super_zoom_put()  の  plane系です。
                   (「plane系」参照)

                ★ plane系関数は通常の(plane系でない)関数より4倍
                   ぐらい高速なのが普通ですが、この関数に限っては
                   super_zoom_put()とほとんど速度が変わりません。

                ★ x_rate や y_rate には 0 を指定してはいけません。
                ★ 透明色について super_zoom() と同じ制限がありま
                   す。
                ○ grc_setclip範囲でクリッピングします。

------------------------------------------------------------------------
□ super_zoom_v_put - パターンの縦拡大/縮小表示

C:      void super_zoom_v_put( int x, int y,  int  num,  unsigned
                              rate);

        ------------------------------------------98N 98H AT DOS-
        super_zoom_v_put                           V  × *
        -------------------------------------------

                ● 左上座標が(x, y)の位置に、番号 num  のパターン
                   を、 y方向に(rate / 256)倍に拡大または縮小して
                   表示します。拡大/縮小の中心は(x, y)固定です。

                ★ rate には 0 を指定してはいけません。
                ★ クリッピングはしていません。

------------------------------------------------------------------------
□ super_zoom_v_put_1plane, vga4_super_zoom_v_put_1plane -  パターンの縦
   拡大/縮小表示(指定プレーン)

C:      super_zoom_v_put_1plane( int x, int y, int num,  unsigned
                                rate, int pattern_plane, unsigned
                                put_plane);
C:      void vga4_super_zoom_v_put_1plane( int x, int y, int num,
                                          unsigned rate, int
                                          pattern_plane, unsigned
                                          put_plane );

        ------------------------------------------98N 98H AT DOS-
        super_zoom_v_put_1plane                    V  × *
        -------------------------------------------
        vga4_super_zoom_v_put_1plane               ×  × V
        -------------------------------------------

                ● 左上座標が(x, y)の位置に、番号 num  のパターン
                   の pattern_plane プレーンのパターンを
                   put_plane  プレーンに、y方向に(rate / 256)倍に
                   拡大または縮小して表示します。 拡大/縮小の中心
                   は(x, y)固定です。
                    super_zoom_v_put() の plane系です。


------------------------------------------------------------------------
■ 図形描画・設定関係 ■■■■■■■■■■■■■■■■■■■■■■■■■

        grc_setclipは、グラフィック画面に描画する際、クリッピング
        を行う関数のための座標範囲を設定する関数です。
        この関数により、 (対応している関数を使えば)画面の任意の長
        方形領域にのみ、 はみださないように描画させることができま
        す。

------------------------------------------------------------------------
□ 構造体/グローバル変数

        ● クリッピング関連の変数
const int ClipXL ;              クリップ枠左端のx座標
const int ClipXW ;              クリップ枠左右端のx座標の差
const int ClipXR ;              クリップ枠右端のx座標
const int ClipYT ;              クリップ枠上端のy座標
const int ClipYH ;              クリップ枠上下端のy座標の差
const int ClipYB ;              クリップ枠下端のy座標
const unsigned ClipYT_seg ;     クリップ枠上端の、x = 0  の地点の
                                VRAM(青プレーン)セグメントアドレ
                                ス。graph_VramSeg, ClipYT  に基づ
                                いて grc_setclip で計算されます。
const unsigned ClipYB_adr       クリップ枠下端の、x = 0  の地点の
                                ClipYT_seg  からの  VRAM オフセッ
                                トアドレス

------------------------------------------------------------------------
□ grc_setclip - クリップ枠を設定する

C:      int  grc_setclip( int xl, int yt, int xr, int yb );

        ------------------------------------------98N 98H AT DOS-
        grc_setclip
        -----------------------------------------------

                ● 画面の描画クリップ枠を設定します。
                   指定領域が完全に画面の外に出ていると、中途半端
                   に設定して 0 を返します。 この場合はすぐに再設
                   定して下さい。
                   名前がClipで始まる変数の設定を行います。

                ○ 初期値は、(0,0)~(639,399)に設定してあります。
                   また、graph_start, graph_enter, graph_400line,
                   graph_200line などによって画面モードを変更した
                   場合、自動的に画面全体に設定されます。


------------------------------------------------------------------------
■ 図形描画・色設定 ■■■■■■■■■■■■■■■■■■■■■■■■■■

         図形描画関数は、 色や演算をあらかじめ設定してから呼び出
        します。そのための色などの指定を行う関数です。
         アクセスプレーン、色、演算などが指定できます。

         98では、grcg_setcolorなどで色を指定し、一連のグラフィッ
        クの描画が終わったら必ず grcg_offを実行してください。
         VGAでは、vgc_setcolorで色を指定します。

        ・なお、関数名の頭にある grcg_ は、98搭載のグラフィック描
          画補助ハードウェア・グラフィックチャージャ(GRCG)を、
          vgc_は、VGAのグラフィックコントローラ(GC)を制御して描画
          することを意味します。

------------------------------------------------------------------------
□ 構造体/グローバル変数

typedef struct Point {          座標を表します。
  int x,y ;
} Point ;

long SolidTile[0..15]           あらかじめ用意された単色を表す
                                1lineタイルの配列です。
                                grcg_settile_1line()に指定できま
                                す。

------------------------------------------------------------------------
□ 定数

        ● GRCG モード値(grcg_setcolor,grcg_setmode)
        表記    値      意味
        GC_OFF  0        GRCG のスイッチを切る。grcg_off()  と同
                        じです。
        GC_TDW  0x80     書き込みが起こると、 タイルレジスタの内
                        容を書き込む。 書き込もうとしたデータは無
                        視される。GC_TCR と同じモード。
        GC_TCR  0x80     読み込みが起こると、 タイルレジスタと一
                        致する色を持つドットだけ1を立てたビットパ
                        ターンが読み込まれる。GC_TDW と同じモード。
        GC_RMW  0xc0     書き込みが起こると、 ビットが立ってると
                        ころはタイルレジスタの対応するドットが書
                        き込まれ、 立っていない所は現在の内容が保
                        存される。読み込んではならない。

        ● 描画演算指定(vgc_setcolor)
        表記            値      意味
        VGA_PSET        0x00f0  PSET(通常)描画モード
        VGA_AND         0x08f0  AND描画モード
        VGA_OR          0x10f0  OR描画モード
        VGA_XOR         0x18f0  XOR描画モード

        ● アクセスプレーン指定(grcg_setcolor)
        表記            値      意味
        GC_B            0x0e    青プレーンをアクセスする
        GC_R            0x0d    赤プレーンをアクセスする
        GC_BR           0x0c            :
        GC_G            0x0b    赤プレーンをアクセスする
        GC_BG           0x0a            :
        GC_RG           0x09
        GC_BRG          0x08            :
        GC_I            0x07    輝度プレーンをアクセスする
        GC_BI           0x06            :
        GC_RI           0x05
        GC_BRI          0x04
        GC_GI           0x03
        GC_BGI          0x02
        GC_RGI          0x01            :
        GC_BRGI         0x00     全プレーンをアクセスする

        ・以下の表の詳細はVGAに関する資料を参照してください。

        ● VGAレジスタインデックスなど
        表記            値      意味
        VGA_PORT        0x03ce
        VGA_COLOR_CMP_REG 2
        VGA_READPLANE_REG 4     ←readplaneは下位2bitにプレーン番
                                  号を書く
        VGA_MODE_REG      5     描画関数ごとに要設定
        VGA_MULTI_REG     6
        VGA_DISABLECMP    7
        VGA_BITMASK_REG   8     描画関数ごとに要設定

        ● VGA_MODE_REGレジスタに設定する内容
        表記            値      意味
        VGA_READPLANE   0       readmap選択regの場所をそのまま読
                                む
        VGA_COMPARE     8       読み込み時色比較レジスタと一致し
                                たらbit on

        ● GCのモード値
        表記            値      意味
        VGA_NORMAL      0       通常モード
        VGA_LATCH       1       コピーモード
        VGA_FILL        2       塗り潰しモード
        VGA_CHAR        3       文字描画モード

------------------------------------------------------------------------
□ grcg_and - GRCGの描画モード(AND)設定

C:      void grcg_and( int mode, int color );

        ------------------------------------------98N 98H AT DOS-
        grcg_and                                   V  × *
        -------------------------------------------

                ● GRCGのモードレジスタに modeを設定し、 タイルレ
                   ジスタに  color に相当する単色を設定します。ま
                   た、modeのアクセスプレーンを color  により編集
                   し、論理積演算と同様の描画が出来るようにします。

                    mode の値については grcg_setmode 参照。

                例: grcg_and( GC_RMW,5 );
                        全プレーンにアクセスする。
                        描画は、5の色で論理積を取る。

------------------------------------------------------------------------
□ grcg_off - GRCGのスイッチを切る

C:      void grcg_off(void);

        ------------------------------------------98N 98H AT DOS-
        grcg_off                                   V  × *
        -------------------------------------------

                ● GRCGのモードレジスタに 0を設定して、スイッチを
                   切ります。GRCGを使用した後は、必ず実行してくだ
                   さい。

                ★ デフォルトでマクロになっていますが、#undef
                   grcg_off とすることにより、 関数呼び出しにでき
                   ます。

------------------------------------------------------------------------
□ grcg_or - GRCGの描画モード(OR)設定

C:      void grcg_or( int mode, int color );

        ------------------------------------------98N 98H AT DOS-
        grcg_or                                    V  × *
        -------------------------------------------

                ● GRCGのモードレジスタに modeを設定し、 タイルレ
                   ジスタに  color に相当する単色を設定します。ま
                   た、modeのアクセスプレーンを color  により編集
                   し、論理和演算と同様の描画が出来るようにします。
                    mode の値については grcg_setmode 参照。

                例: grcg_or( GC_RMW,5 );
                        全プレーンにアクセスする。
                        描画は、5の色で論理和を取る。

------------------------------------------------------------------------
□ grcg_setcolor - GRCGのモードおよび色設定

C:      void grcg_setcolor( int mode, int color );

        ------------------------------------------98N 98H AT DOS-
        grcg_setcolor                              V  × *
        -------------------------------------------

                ● GRCGのモードレジスタに modeを設定し、 タイルレ
                   ジスタに color に相当する単色を設定します。
                   mode に設定する値は、 grcg_setmodeを参照してく
                   ださい。

                例: grcg_setcolor( GC_RMW|GC_BG,0 );
                        青と緑のプレーンにアクセスする。
                        タイルレジスタは全て 00h。

------------------------------------------------------------------------
□ grcg_setmode - GRCGのモード設定

C:      void grcg_setmode( int mode );                     マクロ

        ------------------------------------------98N 98H AT DOS-
        grcg_setmode                               V  × ×
        -----------------------------------------------------<->-

                ● GRCGのモードレジスタに modeを設定します。

                ← mode には、以下の定数が使えます。
                        GC_OFF   GRCG のスイッチを切る。
                                grcg_off() と同じです。
                        GC_TDW   書き込みが起こると、 タイルレジ
                                スタの内容を書き込む。 書き込もう
                                としたデータは無視される。
                                GC_TCR と同じモード。
                        GC_TCR   読み込みが起こると、 タイルレジ
                                スタと一致する色を持つドットだけ1
                                を立てたビットパターンが読み込ま
                                れる。GC_TDW と同じモード。
                        GC_RMW   書き込みが起こると、 ビットが立
                                ってるところはタイルレジスタの対
                                応するドットが書き込まれ、 立って
                                いない所は現在の内容が保存される。
                                読み込んではならない。

                   また、さらに以下の定数を複数 |  (論理和)で組み
                   合せて使うことが出来ます。    デフォルトは
                   GC_BRGI です。

                        GC_[B][R][G][I] アクセスプレーンの制御
                                        []内は省略可能、ただし
                                        全て省略することはでき
                                        ない。

                例: grcg_setmode( GC_RMW|GC_BG );
                        青と緑のプレーンにアクセスする。

------------------------------------------------------------------------
□ grcg_settile_1line - GRCGのモードおよびタイルパターン(1line)設定

C:      void grcg_settile_1line( int mode, long tile );

        ------------------------------------------98N 98H AT DOS-
        grcg_settile_1line                         V  × ×
        -------------------------------------------

                ● GRCGのモードレジスタに modeを設定し、 タイルレ
                   ジスタに tile で指定したタイルパターンを設定し
                   ます。(横8ドット、縦1ラインのみ)

                    mode に設定する値については、 grcg_setmode()
                   の項を参照してください。

                    tile は、4バイトのデータを設定し、最下位バイ
                   トを青プレーン、再上位バイトを輝度プレーンとし
                   ます。(例1)
                    B,R,G,I をプログラムで別々に扱いたいときは、
                   例2のようにすると簡単です。

                例1: 赤と青の交互パターンを設定する場合
                                               /* I G R B */
                    grcg_settile_1line( GC_RMW, 0x0000AA55L );

                例2: 各プレーンを別々に扱う
                     char tile[4] ;
                     tile[0] = 0x55 ;   /* B */
                     tile[1] = 0xaa ;   /* R */
                     tile[2] = 0x00 ;   /* G */
                     tile[3] = 0x00 ;   /* I */
                     grcg_settile_1line(GC_RMW,*(long *)tile);

------------------------------------------------------------------------
□ vgc_setcolor - 描画色の指定

C:      void vgc_setcolor(int mask,int color);

        ------------------------------------------98N 98H AT DOS-
        vgc_setcolor                               ×  × ○
        -------------------------------------------

                ● 描画するための色を GC に設定します。

                ← mask(mode)  描画演算指定と描画プレーン指定の論
                               理和
                               (GC_PSET | GC_BRGI) など。 GC_BRGI
                               は 0 なので、通常は VGA_PSETだけで
                               良い。
                   color       0~15。描画色。

                ○ この指定は、 vgc_*以外の画面操作関数を実行する
                   と無効になります。
                ○ ビットマスクレジスタは0ffh、モードレジスタには
                   VGA_CHAR を設定します。
                ○ 直接ポートアクセスして描画する場合、論理演算指
                   定は VGA_MODE_REG に VGA_LATCH  を指定すると無
                   効になります。


------------------------------------------------------------------------
■ 図形描画 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

         "図形描画・色設定"項で説明されている関数によって設定さ
        れた色や演算モードに従って、図形を描画します。

------------------------------------------------------------------------
□ grc_clip_line - 直線データのクリッピング

C:      int grc_clip_line( Point * p1, Point * p2 );

        ------------------------------------------98N 98H AT DOS-
        grc_clip_line
        -------------------------------------------

                ● p1,p2 を両端とする線分の、クリップ枠に入り切る
                   部分の両端を p1,p2に入れなおします。

                → 0  クリップ枠から完全に外れている
                   1  p1,p2  はクリップ枠に入り切る線分を表すよう
                      になった

                ○ grc_setclip範囲でクリッピングします。

------------------------------------------------------------------------
□ grc_clip_polygon_n - 凸/凹多角形データのクリッピング

C:      int grc_clip_polygon_n( Point * dest,  int  ndest,  const
                               Point * src, int nsrc );

        ------------------------------------------98N 98H AT DOS-
        grc_clip_polygon_n
        -------------------------------------------

                ● 多角形の頂点座標リストを渡すと、クリップ枠に入
                   り切る部分だけの新しい図形データを作成します。

                ← src[]  座標リスト
                   nsrc   点数
                   dest   格納先
                   ndest  格納先の最大要素数

                → -1    src は完全に枠内。src を利用せよ。
                    0    完全に枠外。描画できません。
                    1~  dest[]に格納した点数を返します。

                ○ なお、dest と src は一致させることができます。
                   この場合、戻り値に -1 が返ることはありません。

                ○ grc_setclip範囲でクリッピングします。
                ○ この関数は描画は行いません。

                ★ ndest には、凸多角形の場合 nsrc+4 以上確保して
                   下さい。 凹多角形の場合は、nsrc*2 以上になりま
                   す。
                ★ dest[] は、必ず ndest 要素全てが書き換えられま
                   す。以前の値が残っていることは期待しないで下さ
                   い。

                例 :
                        grcg_polygon_cx の例を参照

------------------------------------------------------------------------
□ grcg_boxfill, vgc_boxfill - 長方形描画

C:      void grcg_boxfill(int x1,int y1,int x2,int y2);
C:      void vgc_boxfill(int x1,int y1,int x2,int y2);

        ------------------------------------------98N 98H AT DOS-
        grcg_boxfill                               V  × *
        -------------------------------------------
        vgc_boxfill                                ×  × ○
        -------------------------------------------

                ● 長方形を塗り潰します。

                ← x1,y1  第1頂点の座標
                   x2,y2  第2頂点の座標

                ○ grc_setclip範囲でクリッピングします。
                ○ 色は、grcg_setcolor または vgc_setcolor で指定
                   します。

------------------------------------------------------------------------
□ grcg_byteboxfill_x, vgc_byteboxfill_x - 横8ドット単位の長方形描画

C:      void grcg_byteboxfill_x( int x1,int y1,int x2,int y2);
C:      void vgc_byteboxfill_x( int x1,int y1,int x2,int y2);

        ------------------------------------------98N 98H AT DOS-
        grcg_byteboxfill_x                         V  × *
        -------------------------------------------
        vgc_byteboxfill_x                          ×  × ○
        -------------------------------------------

                ● 長方形塗り潰しを行います。座標は、横方向が8dot
                   単位になります。

                ← x1,y1  第1頂点の座標
                   x2,y2  第2頂点の座標
                   ・横方向の座標はドットを 8  で割った値で指定し
                     ます。

                ○ 色は、grcg_setcolor または vgc_setcolor で指定
                   します。
                ○ y座標のみ、grc_setclip範囲でクリッピングします。

                ○ 速度追求のために存在します。

                ★ x1,x2 の値は  0~(graph_VramWidth-1)でなければ
                   なりません。
                   x1 ≦ x2, y1 ≦ y2 でなければなりません。
                   横のクリッピングは行っていません。

------------------------------------------------------------------------
□ grcg_bytemesh_x, vgc_bytemesh_x - 横8ドット単位の市松模様塗り潰し

C:      void grcg_bytemesh_x( int x1,int y1,int x2,int y2);
C:      void vgc_bytemesh_x( int x1,int y1,int x2,int y2);

        ------------------------------------------98N 98H AT DOS-
        grcg_bytemesh_x                            V  × *
        -------------------------------------------
        vgc_bytemesh_x                             ×  × ○
        -------------------------------------------

                ● ドット単位の市松模様で長方形塗り潰しを行います。
                   座標は、横方向が8dot単位になります。

                ← x1,y1  第1頂点の座標
                   x2,y2  第2頂点の座標
                   ・横方向の座標はドットを 8  で割った値で指定し
                     ます。

                ○ 色は、grcg_setcolor または vgc_setcolor で指定
                   します。
                ○ yが偶数の所は、graph_MeshByte 変数の値で、 yが
                   奇数のところは  graph_MeshByteの反転のパターン
                   で書き込まれます。

                ★ x1,x2 の値は  0~(graph_VramWidth-1)でなければ
                   なりません。
                   x1 ≦ x2, y1 ≦ y2 でなければなりません。
                   横のクリッピングは行っていません。

------------------------------------------------------------------------
□ grcg_circle, vgc_circle - 円描画

C:      void grcg_circle( int x, int y, int r );
C:      void vgc_circle( int x, int y, int r );

        ------------------------------------------98N 98H AT DOS-
        grcg_circle                                V  × *
        -------------------------------------------
        vgc_circle                                 ×  × ○
        -------------------------------------------

                ● 円の輪郭を描画します。

                ← x,y  中心点の座標
                   r    x方向の半径 ( 1以上 )

                ○ grc_setclip範囲でクリッピングします。
                ○ 色は、grcg_setcolor または vgc_setcolor で指定
                   します。
                ○ 完全にクリップ枠に入り切る場合は内部で
                   grcg_circle_x または vgc_circle_x を呼び出して
                   います。
                ○ 640x200(縦倍)時は、 縦を半分に縮小して見た目が
                   真円になるように描画します。

------------------------------------------------------------------------
□ grcg_circle_x, vgc_circle_x - 円描画(クリッピングなし)

C:      void grcg_circle_x( int x, int y, int r );
C:      void vgc_circle_x( int x, int y, int r );

        ------------------------------------------98N 98H AT DOS-
        grcg_circle_x                              V  × *
        -------------------------------------------
        vgc_circle_x                               ×  × ○
        -------------------------------------------

                ● 円の輪郭を描画します。

                ← x,y  中心点の座標
                   r    半径 ( 1以上 )

                ○ 色は、grcg_setcolor または vgc_setcolor で指定
                   します。
                ○ この関数を使う場合、grcg_circle または
                   vgc_circle  を全く呼ばければ実行形式のサイズが
                   小さくなります。
                ○ 640x200(縦倍)時は、 縦を半分に縮小して見た目が
                   真円になるように描画します。

                ★ クリッピングは行っていません。

------------------------------------------------------------------------
□ grcg_circlefill, vgc_circlefill - 円塗りつぶし

C:      void grcg_circlefill( int x, int y, int r );
C:      void vgc_circlefill( int x, int y, int r );

        ------------------------------------------98N 98H AT DOS-
        grcg_circlefill                            V  × *
        -------------------------------------------
        vgc_circlefill                             ×  × ○
        -------------------------------------------

                ● 円を塗り潰します。

                ← x,y  中心点の座標
                   r    半径

                ○ grc_setclip範囲でクリッピングします。
                ○ 色は、grcg_setcolor または vgc_setcolor で指定
                   します。
                ○ 真円になるためには、1dotが正方形であることが必
                   要です。

------------------------------------------------------------------------
□ grcg_fill - クリップ枠全面塗りつぶし

C:      void grcg_fill(void);

        ------------------------------------------98N 98H AT DOS-
        grcg_fill                                  V  × *
        --------------------------------------------

                ● クリップ枠全体を塗りつぶします。

                ○ 非常に速度を要求する場面では、制限がいろいろあ
                   りますが、grcg_byteboxfill_x  を利用すると便利
                   です。

------------------------------------------------------------------------
□ grcg_hline, vgc_hline - 水平線描画

C:      void grcg_hline(int x1,int x2,int y);
C:      void vgc_hline(int x1,int x2,int y);

        ------------------------------------------98N 98H AT DOS-
        grcg_hline                                 V  × *
        -------------------------------------------
        vgc_hline                                  ×  × ○
        -------------------------------------------

                ● 水平線を描画します。

                ← x1,x2  左右端のそれぞれのx座標
                   y      描画y座標

                ○ grc_setclip範囲でクリッピングします。
                ○ 色は、grcg_setcolor または vgc_setcolor で指定
                   します。

------------------------------------------------------------------------
□ grcg_line, vgc_line - 直線描画

C:      void grcg_line(int x1,int y1,int x2,int y2);
C:      void vgc_line(int x1,int y1,int x2,int y2);

        ------------------------------------------98N 98H AT DOS-
        grcg_line                                  V  × *
        --------------------------------------------
        vgc_line                                   ×  × ○
        --------------------------------------------

                ● 直線を描画します。

                ← x1,y1  第1頂点の座標
                   x2,y2  第2頂点の座標

                ○ grc_setclip範囲でクリッピングします。
                ○ 色は、grcg_setcolor または vgc_setcolor で指定
                   します。

------------------------------------------------------------------------
□ grcg_polygon_c, vgc_polygon_c - 凸多角形描画

C:      void grcg_polygon_c( const Point * pts, int npoint );
C:      void vgc_polygon_c( const Point * pts, int npoint );

        ------------------------------------------98N 98H AT DOS-
        grcg_polygon_c                             V  × *
        -------------------------------------------
        vgc_polygon_c                              ×  × ○
        -------------------------------------------

                ● pts[]に座標リストを渡して凸多角形を描画します。

                ← npoint  点の数を指定。(3以上)

                ○ 色は、grcg_setcolor または vgc_setcolor で指定
                   します。
                ○ grc_setclip範囲でクリッピングします。
                ○ grcg_polygon_cx と grc_clip_polygon_n の組み合
                   せを利用した方が高速です。

                ★ 凸多角形にならないデータを渡されると、ゼロ除算
                   エラーが発生することがあります。

------------------------------------------------------------------------
□ grcg_polygon_cx, vgc_polygon_cx - 凸多角形描画(クリッピングなし)

C:      void grcg_polygon_cx( const Point * pts, int npoint );
C:      void vgc_polygon_cx( const Point * pts, int npoint );

        ------------------------------------------98N 98H AT DOS-
        grcg_polygon_cx                            V  × *
        -------------------------------------------
        vgc_polygon_cx                             ×  × ○
        -------------------------------------------

                ● pts[]に座標リストを渡して凸多角形を描画します。

                ← npoint  点の数を指定。
                           0以下ならば描画しません。
                           1 ならば、点を描画します。
                           2 ならば、直線を描画します。

                ○ 色は、grcg_setcolor または vgc_setcolor で指定
                   します。
                ○ データレベルでのクリッピングについては、
                   grc_clip_polygon_n 参照
                ○ grc_setclip範囲でクリッピングします。
                ○ grcg_polygon_cよりも約 5%高速です。 描画する図
                   形がクリップ枠に必ず入り切る場合に利用してくだ
                   さい。  なお、  クリップ枠に入らないデータも、
                   grc_clip_polygon_n  によって必ず入り切るデータ
                   に変換するすることができます。この場合、次の例
                   のように描画の必要がない場面では描画の準備もス
                   キップすることができるので、より合理的になりま
                   す。

                例 :
                   Point p[MAX] ;
                   int np ;
                   (この間にp[0..np-1]に各頂点を設定する)
                   np = grc_clip_polygon_n(p,MAX,p,np);
                   if ( np > 0 ) {
                        /* 色設定 */
                        grcg_setcolor( GC_RMW, 5 );
                        /* 描画 */
                        grcg_polygon_cx( p, np );
                        /* 後処理 */
                        grcg_off();
                   }

                ★ クリッピングは行っていません。
                ★ 凸多角形にならないデータを渡されると、ゼロ除算
                   エラーが発生することがあります。

------------------------------------------------------------------------
□ grcg_polygon_vcx, vgc_polygon_vcx -  凸多角形描画(クリッピングなし,可
   変引数)

C:      void grcg_polygon_vcx( int npoint, int x1, int y1, ... );
C:      void vgc_polygon_vcx( int npoint, int x1, int y1, ... );

        ------------------------------------------98N 98H AT DOS-
        grcg_polygon_vcx                           V  × *
        -------------------------------------------
        vgc_polygon_vcx                            ×  × ○
        -------------------------------------------

                ● 座標リストを直接引数にならべて渡して凸多角形を
                   描画します。npointに点の数を指定します。
                     npoint ≦ 0 ならば描画しません。
                     npoint = 1 ならば、点を描画します。
                     npoint = 2 ならば、直線を描画します。
                ★ 凸多角形にならないデータを渡されると、ゼロ除算
                   エラーが発生することがあります。

                ○ grcg_polygon_cx と処理内容は同一です。

------------------------------------------------------------------------
□ grcg_pset, vgc_pset - 点描画

C:      void grcg_pset(int x,int y);
C:      void vgc_pset(int x,int y);

        ------------------------------------------98N 98H AT DOS-
        grcg_pset                                  V  × *
        --------------------------------------------
        vgc_pset                                   ×  × ○
        --------------------------------------------

                ● 点を描画します。

                ← x,y  描画座標

                ○ grc_setclip範囲でクリッピングします。
                ○ 色は、grcg_setcolor または vgc_setcolor で指定
                   します。

------------------------------------------------------------------------
□ grcg_round_boxfill, vgc_round_boxfill - 角の丸い長方形描画

C:      void grcg_round_boxfill( int x1, int y1, int x2, int  y2,
                                unsigned r );
C:      void vgc_round_boxfill( int x1, int y1, int x2,  int  y2,
                               unsigned r );

        ------------------------------------------98N 98H AT DOS-
        grcg_round_boxfill                         V  × *
        -------------------------------------------
        vgc_round_boxfill                          ×  × ○
        -------------------------------------------

                ● 四隅を丸くした長方形塗り潰しを行います。

                ← x1,y1  第1頂点の座標
                   x2,y2  第2頂点の座標
                   r      四隅の円の半径

                ○ grc_setclip範囲でクリッピングします。
                ○ 色は、grcg_setcolor または vgc_setcolor で指定
                   します。

------------------------------------------------------------------------
□ grcg_thick_line, vgc_thick_line - 四角いペンによる直線描画

C:      void grcg_thick_line( int x1, int y1,  int  x2,  int  y2,
                             unsigned wid, unsigned hei );
C:      void vgc_thick_line( int x1, int  y1,  int  x2,  int  y2,
                            unsigned wid, unsigned hei );

        ------------------------------------------98N 98H AT DOS-
        grcg_thick_line                            V  × *
        -------------------------------------------
        vgc_thick_line                             ×  × ○
        -------------------------------------------

                ● (x1,y1)から(x1+wid,y1+hei)の長方形と、 (y2,y2)
                   から(y2+wid,y2+hei)の長方形を両端とする太い直
                   線を描画します。

                ← x1,y1  第1頂点の座標
                   x2,y2  第2頂点の座標
                   wid    線を構成する横の太さ
                   hei    線を構成する縦の太さ

                ○ grc_setclip範囲でクリッピングします。
                ○ 色は、grcg_setcolor または vgc_setcolor で指定
                   します。

                ○ 内部で grcg_polygon_c, grcg_boxfill, grcg_line
                   を呼び出しています。

------------------------------------------------------------------------
□ grcg_trapezoid, vgc_trapezoid - 台形塗り潰し

C:      void grcg_trapezoid( int y1, int x11, int  x12,  int  y2,
                            int x21, int x22 );
C:      void vgc_trapezoid( int y1, int x11, int x12, int y2, int
                           x21, int x22 );

        ------------------------------------------98N 98H AT DOS-
        grcg_trapezoid                             V  × *
        --------------------------------------------
        vgc_trapezoid                              ×  × ○
        -------------------------------------------

                ● (x11,y1),(x12,y1),(x21,y2),(x22,y2) の4点を
                   この順に結ぶ四辺形を塗りつぶして描画します。
                   (下図参照)

                           (x11,y1)  (x12,y1)
                                +-------+
                               ・         ・
                              ・           ・
                             ・             ・
                            +---------------+
                        (x21,y2)        (x22,y2)

                    上の辺と下の辺の向きが逆の場合は、下図の様に
                   交差した図形を描画します。

                             (x11,y1)    (x12,y1)
                                +-----------+
                                  ・       ・
                                    ・   ・
                                      ・
                                    ・   ・
                                  +-------+
                              (x22,y2)  (x21,y2)

                ← y1       上底のy座標
                   x11,x12  上底の2つのx座標
                   y2       下底のy座標
                   x21,x22  下底の2つのx座標

                ○ grc_setclip範囲でクリッピングします。
                ○ 色は、grcg_setcolor または vgc_setcolor で指定
                   します。

------------------------------------------------------------------------
□ grcg_triangle, vgc_triangle - 三角形塗り潰し

C:      void grcg_triangle( int x1,int y1,  int  x2,int  y2,  int
                           x3,int y3 );
C:      void vgc_triangle( int x1,int  y1,  int  x2,int  y2,  int
                          x3,int y3 );

        ------------------------------------------98N 98H AT DOS-
        grcg_triangle                              V  × *
        -------------------------------------------
        vgc_triangle                               ×  × ○
        -------------------------------------------

                ● 三角形塗り潰しを行います。

                ← x1,y1  第1頂点の座標
                   x2,y2  第2頂点の座標
                   x3,y3  第3頂点の座標

                ○ 色は、grcg_setcolor または vgc_setcolor で指定
                   します。
                ○ grc_setclip範囲でクリッピングします。
                ○ クリッピングの速度が多少遅いので、呼び出し回数
                   に比べて実際にクリップ枠内に現れる比率が低いと
                   きには、 凸多角形(grcg_polygon_cx)を使用してく
                   ださい。

------------------------------------------------------------------------
□ grcg_triangle_x - 三角形描画(クリッピングなし)

C:      void grcg_triangle_x( Point * pts );

        ------------------------------------------98N 98H AT DOS-
        grcg_triangle_x                            V  × *
        -------------------------------------------

                ● 三角形を描画します。引数の pts は必ず  3点でな
                   ければなりません。 grc_clip_polygon_n の結果が
                   3 になったときに呼び出すと高速に三角形を描画す
                   ることができます。

------------------------------------------------------------------------
□ grcg_vline, vgc_vline - 垂直線描画

C:      void grcg_vline(int x,int y1,int y2);
C:      void vgc_vline(int x,int y1,int y2);

        ------------------------------------------98N 98H AT DOS-
        grcg_vline                                 V  × *
        -------------------------------------------
        vgc_vline                                  ×  × ○
        -------------------------------------------

                ● 垂直線を描画します。

                ← x      描画 x座標
                   y1,y2  上下端のそれぞれのy座標

                ○ grc_setclip範囲でクリッピングします。
                ○ 色は、grcg_setcolor または vgc_setcolor で指定
                   します。

------------------------------------------------------------------------
□ vgc_byteboxfill_x_pset - 長方形塗り潰し(8dot単位,演算なし)

C:      void vgc_byteboxfill_x_pset(int x1,int y1,int x2,int y2);

        ------------------------------------------98N 98H AT DOS-
        vgc_byteboxfill_x_pset                     ×  × ○
        -------------------------------------------

                ● 長方形塗り潰しを行います。座標は、横方向が8dot
                   単位になります。 演算を省いたため、 処理速度が
                   vgc_byteboxfill_x よりも高速です。

                ← x1,y1  第1頂点の座標
                   x2,y2  第2頂点の座標
                   ・横方向の座標はドットを 8  で割った値で指定し
                     ます。

                ○ 色は、vgc_setcolor で指定します。ただし、 演算
                   モードはVGA_PSET固定です。

                ★ x1,x2 の値は  0~(graph_VramWidth-1)でなければ
                   なりません。
                   x1 ≦ x2, y1 ≦ y2 でなければなりません。
                   横のクリッピングは行っていません。


------------------------------------------------------------------------
□ vgc_line2 - 直線描画(ラインスタイルつき)

C:      void vgc_line2(  int  x1,int  y1,int  x2,int  y2,unsigned
                       lstyle);

        ------------------------------------------98N 98H AT DOS-
        vgc_line2                                  ×  × ○
        -------------------------------------------

                ● ラインスタイルを指定して直線を描画します。

                ← x1,y1   第1頂点の座標
                   x2,y2   第2頂点の座標
                   lstyle  ラインスタイル。16dot周期で、値が1のビ
                           ットの部分に描画します。

                ○ grc_setclip範囲でクリッピングします。
                ○ 色は、vgc_setcolor で指定します。


------------------------------------------------------------------------
■ PC-9801 GDCによる描画 ■■■■■■■■■■■■■■■■■■■■■■■

        PC-9801シリーズには、 GDCという描画ハードウェアが装備され
        ています。ただし古いので、できることは限られていますが。

------------------------------------------------------------------------
□ 構造体/グローバル変数

int GDCUsed ;           <98> GDC の描画を行ったので VRAM アクセス
                        には注意を要する状態になっている場合を表
                        す場合に、 0  以外になります。  gdc_line,
                        gdc_circle  によって設定され、gdc_wait に
                        よって参照、設定されます。 gdc_line,
                        gdc_circle  以外の手段によって GDC 描画を
                        行った場合、 自分でこの変数に値を設定して
                        ください。

------------------------------------------------------------------------
□ gdc_circle - GDC による円描画

C:      void gdc_circle( int x, int y, unsigned r );

        ------------------------------------------98N 98H AT DOS-
        gdc_circle                                 ○  × *
        -------------------------------------------

                ● GDC を利用して、円の描画を開始します。

                ○ GDC の特性として、CPU の動作と平行して描画を行
                   うので、この手続きを実行した後も GDC  の描画は
                   続いています。GDC 以外の手段で VRAM をアクセス
                   する場合は、必ず gdc_wait を実行して描画完了を
                   確認してください。
                ○ 半径が 0 のときは描画しません。
                ○ GDCの周波数は、2.5MHz/5MHzを自動判別します。
                ○ grc_setclipの範囲でクリッピングします。
                ○ 真円になるためには、1dotが正方形であることが必
                   要です。

------------------------------------------------------------------------
□ gdc_line - GDC による直線描画

C:      void gdc_line( int x1,int y1,int x2,int y2 );

        ------------------------------------------98N 98H AT DOS-
        gdc_line                                   ○  × *
        --------------------------------------------

                ● GDC を利用して、直線の描画を開始します。

                ○ GDC の特性として、CPU の動作と平行して描画を行
                   うので、この手続きを実行した後も GDC  の描画は
                   続いています。GDC 以外の手段で VRAM をアクセス
                   する場合は、必ず gdc_wait を実行して描画完了を
                   確認してください。
                ○ GDCの周波数は、2.5MHz/5MHzを自動判別します。
                ○ grc_setclipの範囲でクリッピングします。

------------------------------------------------------------------------
□ gdc_setaccessplane - VRAM アクセスプレーンの設定

C:      void gdc_setaccessplane(int plane);                マクロ

        ------------------------------------------98N 98H AT DOS-
        gdc_setaccessplane                         ○  × *
        -----------------------------------------------------<->-

                ● GDC 描画時の、アクセスを許可する VRAM プレーン
                   を設定します。 plane に設定する値は、
                   grcg_setmode に与えるプレーン情報が使えます。

                例: 赤と青のプレーンに描画する場合
                    gdc_setaccessplane( GC_BR );

------------------------------------------------------------------------
□ gdc_setcolor - 描画色と演算の設定

C:      void gdc_setcolor(int color);                      マクロ

        ------------------------------------------98N 98H AT DOS-
        gdc_setcolor                               ○  × *
        -----------------------------------------------------<->-

                ● GDC による描画色と演算モードを設定します。
                   色(0~15)と、 以下の演算モード定数の論理和の結
                   果を color に設定します。
                      GDC_PSET
                      GDC_XOR
                      GDC_OR
                      GDC_AND

                例: 7番の色で XOR 描画する場合
                      gdc_setcolor( GDC_XOR | 7 );

------------------------------------------------------------------------
□ gdc_setlinestyle - ラインスタイルの設定

C:      void gdc_setlinestyle(unsigned style);             マクロ

        ------------------------------------------98N 98H AT DOS-
        gdc_setlinestyle                           ○  × *
        -----------------------------------------------------<->-

                ● GDC 描画のためのラインスタイルを設定します。

------------------------------------------------------------------------
□ gdc_wait - GDC 描画完了待ち

C:      void gdc_wait(void);

        ------------------------------------------98N 98H AT DOS-
        gdc_wait                                   ○  × *
        --------------------------------------------

                ● GDC 描画開始後、完全に描画が完了するまで待ちま
                   す。GDC による描画を行った場合、  次に他の手段
                   で VRAM をアクセスする前に必ず実行してください。

                ○ GDC 描画の後、完了を待たずに他の手段で VRAM を
                   アクセスすると、画面にゴミが残ってしまう場合が
                   あります。
                ○ GDCUsed 変数が 0  以外に設定されている場合にの
                   み、完了を待つ動作を行います。
                    これにより、不要な完了待ちの時間が省けます。
                   詳しくは GDCUsed 変数の項を参照してください。


------------------------------------------------------------------------
■ PC-9801 EGC操作 ■■■■■■■■■■■■■■■■■■■■■■■■■■

         PC-9801VX 以降の機種に搭載されているハードウェア
        EGC(Enhanced Graphic Charger) は、 その以前の機種に搭載さ
        れている GRCG 以上に強力な機能を持っています。
         EPSON PC-286系、PC-386系は  EGCが搭載されていない機種が
        結構ありますので、注意してください。

         egc_set*や egc_select*系関数で使われる  EGCのレジスタな
        どの意味は、別途資料を入手してください。

------------------------------------------------------------------------
□ egc_end - EGCの終了処理

C:      void egc_end(void);

        ------------------------------------------98N 98H AT DOS-
        egc_end                                    V  × ×
        ------------------------------------------------

                ● egc_start と同じです。

------------------------------------------------------------------------
□ egc_off - EGCをGRCG互換モードに設定する

C:      void egc_off(void);

        ------------------------------------------98N 98H AT DOS-
        egc_off                                    V  × ×
        ------------------------------------------------

                ● EGCを GRCG互換モードに設定し、スイッチを切りま
                   す。

                ★  EGC非搭載機で実行するとハングアップする場合が
                    あります。

------------------------------------------------------------------------
□ egc_on - EGCを拡張モードに設定する

C:      void egc_on(void);

        ------------------------------------------98N 98H AT DOS-
        egc_on                                     V  × ×
        ------------------------------------------------

                ● EGCは、起動時は GRCG  互換モードになっているた
                   め GRCG 用のプログラムがそのまま使えます。しか
                   し、 EGC本来の性能を発揮するには拡張モードにし
                   なければなりません。この関数(手続き)では、拡張
                   モードに設定することで以後 GRCG より多くの機能
                   を用いて grcg_* 描画関数を使うことが出来ます。

                ★ EGC非搭載機で実行するとハングアップする場合が
                   あります。
                ★ EGCのスイッチが入っている時には GRCG  操作関数
                   は使用しないで下さい。使用すると誤動作します。

------------------------------------------------------------------------
□ egc_scroll_left - EGCによる円筒左スクロール

C:      void egc_scroll_left(int dots);

        ------------------------------------------98N 98H AT DOS-
        egc_scroll_left                            V  × ×
        --------------------------------------------

                ● グラフィック画面全体を、dot ドットだけ左にスク
                   ロールします。画面の左端からはみ出した部分は右
                   端に回って表示される。

                ★ 引数 dot は、1 ≦ dot ≦ 15 でなければなりませ
                   ん。この範囲外の引数を与えた場合の動作は不定で
                   す。
                ★ 16 ドット以上のスクロールは、 graph_scroll()な
                   どと併用する必要がある。

------------------------------------------------------------------------
□ egc_scroll_right - EGCによる円筒右スクロール

C:      void egc_scroll_right(int dots);

        ------------------------------------------98N 98H AT DOS-
        egc_scroll_right                           V  × ×
        --------------------------------------------

                ● グラフィック画面全体を、dot ドットだけ右にスク
                   ロールします。画面の右端からはみ出した部分は左
                   端に回って表示される。

                ★ 引数 dot は、1 ≦ dot ≦ 15 でなければなりませ
                   ん。この範囲外の引数を与えた場合の動作は不定で
                   す。
                ★ 16 ドット以上のスクロールは、 graph_scroll()な
                   どと併用する必要がある。

------------------------------------------------------------------------
□ egc_selectfg - P入力にFG色を選択

C:      void egc_selectfg(void);                           マクロ

        ------------------------------------------98N 98H AT DOS-
        egc_selectfg                               V  × ×
        -----------------------------------------------------<->-

                ● 描画色にフォアグラウンド色を利用するようにしま
                   す。

------------------------------------------------------------------------
□ egc_selectbg - P入力にBG色を選択

C:      void egc_selectbg(void);                           マクロ

        ------------------------------------------98N 98H AT DOS-
        egc_selectbg                               V  × ×
        -----------------------------------------------------<->-

                ● 描画色にバックグラウンド色を利用するようにしま
                   す。

------------------------------------------------------------------------
□ egc_selectpat - P入力にパターンレジスタを選択

C:      void egc_selectpat(void);                          マクロ

        ------------------------------------------98N 98H AT DOS-
        egc_selectpat                              V  × ×
        -----------------------------------------------------<->-

                ● 描画色にパターンレジスタを利用するようにします。
                   (デフォルト)

------------------------------------------------------------------------
□ egc_setbgcolor - BG色の設定

C:      void egc_setbgcolor(int color);                    マクロ

        ------------------------------------------98N 98H AT DOS-
        egc_setbgcolor                             V  × ×
        -----------------------------------------------------<->-

                ● バックグラウンド色を設定します。

------------------------------------------------------------------------
□ egc_setfgcolor - FG色の設定

C:      void egc_setfgcolor(int color);                    マクロ

        ------------------------------------------98N 98H AT DOS-
        egc_setfgcolor                             V  × ×
        -----------------------------------------------------<->-

                ● フォアグラウンド色を設定します。

------------------------------------------------------------------------
□ egc_setrop - EGCのモードとROPを設定する

C:      void egc_setrop(int mode_rop);                     マクロ

        ------------------------------------------98N 98H AT DOS-
        egc_setrop                                 V  × ×
        -----------------------------------------------------<->-

                ● モードとラスタオペレーションを設定します。

------------------------------------------------------------------------
□ egc_shift_down - EGCによる部分下スクロール

C:      void egc_shift_down( int x1, int y1, int x2, int y2,  int
                            dots);

        ------------------------------------------98N 98H AT DOS-
        egc_shift_down                             V  × ×
        --------------------------------------------

                ● グラフィック画面の(x1, y1) - (x2,  y2)の範囲を
                   dot  ドットだけ下にシフトします。 シフトされる
                   範囲の上端 dot  ドット分の領域は関数を呼ぶ前の
                   まま変わりません。

                ★ 引数 x1、x2 は 0 ≦ x1 ≦ 639 で、x1 < x2 の範
                   囲内でなければなりません。
                ★ 引数 y1、y2 は 0 ≦ y1 ≦ 399、0 ≦ y2 ≦ (399
                   - dot) で y1 < y2 でなければなりません。
                ★ 引数 dot は、dot ≧ 1 でなければなりません。こ
                   の範囲外の引数を与えた場合の動作は不定です。

------------------------------------------------------------------------
□ egc_shift_down_all - EGCによる下スクロール

C:      void egc_shift_down_all(int dots);

        ------------------------------------------98N 98H AT DOS-
        egc_shift_down_all                         V  × ×
        -------------------------------------------

                ● グラフィック画面全体を、dot ドットだけ下にシフ
                   トします。画面の上端 dot ドット分の領域は、 関
                   数を呼ぶ前のまま変わりません。

                ★ 引数 dot は、dot ≧ 1 でなければなりません。こ
                   の範囲外の引数を与えた場合の動作は不定です。

------------------------------------------------------------------------
□ egc_shift_left - EGCによる部分左スクロール

C:      void egc_shift_left( int x1, int y1, int x2, int y2, int dots);

        ------------------------------------------98N 98H AT DOS-
        egc_shift_left                             V  × ×
        --------------------------------------------

                ● グラフィック画面の(x1, y1) - (x2,  y2)の範囲を
                   dot  ドットだけ左にシフトします。 シフトされる
                   範囲の右端 dot  ドット分の領域は関数を呼ぶ前の
                   まま変わりません。

                ★ 引数 x1、x2 は dot ≦ x1 ≦ 639、0  ≦  x2  ≦
                   639 で x1 < x2 の範囲内でなければなりません。
                ★ 引数 y1、y2 は 0 ≦ y1 ≦ 399、0 ≦ y2 ≦  399
                   で y1 < y2 の範囲内でなければなりません。
                ★ 引数 dot は、dot ≧ 1 でなければなりません。こ
                   の範囲外の引数を与えた場合の動作は不定です。

------------------------------------------------------------------------
□ egc_shift_left_all - EGCによる左スクロール

C:      void egc_shift_left_all(int dots);

        ------------------------------------------98N 98H AT DOS-
        egc_shift_left_all                         V  × ×
        -------------------------------------------

                ● グラフィック画面全体を、dot ドットだけ左にシフ
                   トします。画面の右端 dot ドット分の領域は、 関
                   数を呼ぶ前のまま変わりません。

                ★ 引数 dot は、dot ≧ 1 でなければなりません。こ
                   の範囲外の引数を与えた場合の動作は不定です。

------------------------------------------------------------------------
□ egc_shift_right - EGCによる部分右スクロール

C:      void egc_shift_right( int x1, int y1, int x2, int y2, int dots);

        ------------------------------------------98N 98H AT DOS-
        egc_shift_right                            V  × ×
        --------------------------------------------

                ● グラフィック画面の(x1, y1) - (x2,  y2)の範囲を
                   dot  ドットだけ右にシフトします。 シフトされる
                   範囲の左端 dot  ドット分の領域は関数を呼ぶ前の
                   まま変わりません。

                ★ 引数 x1、x2 は 0 ≦ x1 ≦ 639、0 ≦ x2 ≦ (639
                   - dot) でx1 < x2 の範囲内でなければなりません。
                ★ 引数 y1、y2 は 0 ≦ y1 ≦ 399、0 ≦ y2 ≦  399
                   で y1 < y2 の範囲内でなければなりません。
                ★ 引数 dot は、dot ≧ 1 でなければなりません。こ
                   の範囲外の引数を与えた場合の動作は不定です。

------------------------------------------------------------------------
□ egc_shift_right_all - EGCによる右スクロール

C:      void egc_shift_right_all(int dots);

        ------------------------------------------98N 98H AT DOS-
        egc_shift_right_all                        V  × ×
        -------------------------------------------

                ● グラフィック画面全体を、dot ドットだけ右にシフ
                   トします。画面の左端 dot ドット分の領域は、 関
                   数を呼ぶ前のまま変わりません。

                ★ 引数 dot は、dot ≧ 1 でなければなりません。こ
                   の範囲外の引数を与えた場合の動作は不定です。

------------------------------------------------------------------------
□ egc_shift_up - EGCによる部分上スクロール

C:      void egc_shift_up( int x1, int y1, int x2, int y2, int dots);

        ------------------------------------------98N 98H AT DOS-
        egc_shift_up                               V  × ×
        --------------------------------------------

                ● グラフィック画面の(x1, y1) - (x2,  y2)の範囲を
                   dot  ドットだけ上にシフトします。 シフトされる
                   範囲の下端 dot  ドット分の領域は関数を呼ぶ前の
                   まま変わりません。

                ★ 引数 x1、x2 は 0 ≦ x1 ≦ 639 で、x1 < x2 の範
                   囲内でなければなりません。
                ★ 引数 y1、y2 は dot ≦ y1 ≦ 399、0  ≦  y2  ≦
                   399 で y1 < y2の範囲内でなければなりません。
                ★ 引数 dot は、dot ≧ 1 でなければなりません。こ
                   の範囲外の引数を与えた場合の動作は不定です。

------------------------------------------------------------------------
□ egc_shift_up_all - EGCによる上スクロール

C:      void egc_shift_up_all(int dots);

        ------------------------------------------98N 98H AT DOS-
        egc_shift_up_all                           V  × ×
        -------------------------------------------

                ● グラフィック画面全体を、dot ドットだけ上にシフ
                   トします。画面の下端 dot ドット分の領域は、 関
                   数を呼ぶ前のまま変わりません。

                ★ 引数 dot は、dot ≧ 1 でなければなりません。こ
                   の範囲外の引数を与えた場合の動作は不定です。

------------------------------------------------------------------------
□ egc_start - EGCの初期設定

C:      void egc_start(void);

        ------------------------------------------98N 98H AT DOS-
        egc_start                                  V  × ×
        ------------------------------------------------

                ● EGCの各種レジスタを初期設定し、EGCのスイッチを
                   切ります。 EGCはレジスタの値を読み取ることがで
                   きないので、安定動作のためには利用する前に
                   egc_start によって全てのレジスタを通常設定にし
                   て下さい。 また、終了前には egc_end を呼び出し
                   て下さい。

                ○ EGC搭載機ではプログラム起動時にこれを行うべき
                   です。 (一部のアプリケーションに拡張モードにし
                   たまま終了してしまうものがあるため)
                ○ egc_start()とegc_end()は一つのルーチンの別名で
                   す。

                ★ EGC非搭載機で実行するとハングアップする場合が
                   あります。必ず EGCの存在確認をしてから実行して
                   ください。

                利用法の骨格 :
                        if ( has_egc() ) {
                            egc_start();/* 起動時 */
                            egc_on();
                            egc レジスタ設定
                            grcg_描画 ;
                            egc_off();
                            egc_end(); /* 終了時 */
                        }

------------------------------------------------------------------------
□ has_egc - EGCが利用できるかどうかの判定

C:      int has_egc(void);                                 マクロ

        ------------------------------------------98N 98H AT DOS-
        has_egc                                    V  × ×
        -----------------------------------------------------<->-

                ● EGCが利用できる環境であれば、0以外を返します。


------------------------------------------------------------------------
■ 割り込み ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■


------------------------------------------------------------------------
■ VSYNC割り込み ■■■■■■■■■■■■■■■■■■■■■■■■■■■

         VSYNC割り込みは、CRTの垂直帰線、 すなわち画面全体の表示
        一周ごとに発生する割り込みです。
         PC-9801 シリーズのノーマルモードで通常の640x400ドット用
        CRTを接続している場合は1秒間に約57回の頻度で発生します。
         VGAの場合、標準VGAのビデオモードの場合は、1秒間に約60回
        の頻度で発生しますが、 VGA自体にVSYNC割り込みが付いている
        と仮定できないため、 擬似的にタイマ割り込みを使って実現し
        ています。

         この簡易版処理は、この割り込みを利用して、 二つのカウン
        タ変数を増加します。 アプリケーションは、この値を0にして
        から経過した時間を、 直接変数を参照することにより知ること
        ができます。

------------------------------------------------------------------------
□ 構造体/グローバル変数

unsigned vsync_Count1;  どちらも、VSYNC割り込み毎に 1 ずつ
unsigned vsync_Count2;  増加する変数です。
                        65535の次は 0 になってしまいますので、 長
                        時間の計測には向きません。
                        使うときは、まず 0 に設定してください。

void (far * vsync_Proc)(void);
                        VSYNC割り込みルーチンから呼ばれるサブルー
                        チンのアドレス。
                        vsync_proc_set()によって設定されます。

unsigned vsync_Delay;   VSYNC割り込みを遅らせる値。 VSYNC割り込み
                        が一回発生するごとにこの値を内部の見えな
                        いカウンタに加算してゆき、65535を越えるご
                        とに一回、VSYNC割り込みがかからなかったこ
                        とにします。これにより、VSYNC割り込みの頻
                        度を微妙に少なくすることができます。 初期
                        値は0。

void (far interrupt * vsync_OldVect)(void);
                        vsync_start()実行前のVSYNC割り込みのベク
                        タ内容。
                        vsync_end()で使用されます。

unsigned vsync_Freq     擬似vsync割り込みの周期

------------------------------------------------------------------------
□ vsync_end, vga_vsync_end - VSYNC割り込みの使用終了

C:      void vsync_end(void);
C:      void vga_vsync_end(void);

        ------------------------------------------98N 98H AT DOS-
        vsync_end                                  ○     *
        ----------------------------------------------
        vga_vsync_end                              ×  × ○
        -------------------------------------------

                ● VSYNC 割り込みが設定されていれば、それを解除し
                   ます。設定されていなければ何もしません。

                ★ 一度vsync_startを実行したら、 プログラムを終了
                   するまでにこれを実行する必要があります。
                    これを守らなかった場合、あとで暴走することに
                   なります。

------------------------------------------------------------------------
□ vsync_enter - VSYNC割り込みのチェイン設定

C:      void vsync_enter(void);

        ------------------------------------------98N 98H AT DOS-
        vsync_enter                                ○     ×
        -------------------------------------------

                ● すでに他のプログラム(主に常駐ソフト)によって使
                   用されている VSYNC 割り込みを活かしたまま、 さ
                   らに VSYNC 割り込み処理を追加設定します。
                    また、カウンタ変数を0に設定します。

                   カウンタ変数:
                     vsync_Count1, vsync_Count2

                ○ すでに vsync_start  が実行されている場合にも使
                   えますが、 解除のために  vsync_leave  を使うと
                   master.lib は VSYNC 割り込みを起動前の状態に復
                   元してしまうので、VSYNC 割り込み機能を続けて使
                   いたい場合はもう一度   vsync_start/vsync_enter
                   を実行する必要があります。

                ★ 一度設定したら、プログラムを終了するまでに
                   vsync_leave を実行する必要があります。
                    実行せずに終了した場合、あとで暴走することに
                   なります。

------------------------------------------------------------------------
□ vsync_leave - VSYNC割り込みのチェイン解放

C:      void vsync_leave(void);

        ------------------------------------------98N 98H AT DOS-
        vsync_leave                                ○     ×
        ----------------------------------------------

                ● VSYNC 割り込みが設定されていれば、それを解除し
                   ます。設定されていなければ何もしません。

                ★ 一度 vsync_enter を実行したら、 プログラムを終
                   了するまでにこれを実行する必要があります。
                    これを守らなかった場合、あとで暴走することに
                   なります。

------------------------------------------------------------------------
□ vsync_proc_reset - VSYNC毎に実行する関数の指定解除

C:      void vsync_proc_reset(void);                       マクロ

        ------------------------------------------98N 98H AT DOS-
        vsync_proc_reset
        -----------------------------------------------------<->-

                ● vsync_proc_set()の指定を解除します。

------------------------------------------------------------------------
□ vsync_proc_set - VSYNC毎に実行する関数の指定

C:      void vsync_proc_set( (void (far *func)(void)) );   マクロ

        ------------------------------------------98N 98H AT DOS-
        vsync_proc_set
        -----------------------------------------------------<->-

                ● この指定を行うと、vsync_start後であればvsync割
                   り込み発生ごとに、vsync_Count1などの処理の後に
                   funcを呼び出します。

                ← func  引数なし、 戻り値なしのfar関数へのポイン
                         タ。

------------------------------------------------------------------------
□ vsync_start, vga_vsync_start -  VSYNC割り込みの設定およびカウンタリセ
   ット

C:      void vsync_start(void);
C:      void vga_vsync_start(void);

        ------------------------------------------98N 98H AT DOS-
        vsync_start                                ○     *
        ----------------------------------------------
        vga_vsync_start                            ×  × ○
        -------------------------------------------

                ● VSYNC 割り込みがまだ設定されていなければ、設定
                   します。
                    設定されていてもいなくてもカウンタ変数を0に
                   設定します。
                   インターバル割り込みの周期を細工して、
                   VSYNC 割り込みを擬似的に実現します。また、従来
                   のベクタアドレスへも、 1秒あたり18.2回になるよ
                   うに呼び出します。

                   カウンタ変数:
                     vsync_Count1, vsync_Count2

                ○ この関数を実行すると、以下の変数が動作するよう
                   になります。
                    vsync_Count1   vsyncごとに1増加
                    vsync_Count2   vsyncごとに1増加
                    vsync_Proc     NULLでなければ vsyncごとに呼び
                                   出される

                ★ 一度設定したら、プログラムを終了するまでに
                   vsync_end または vga_vsync_end  を実行する必要
                   があります。
                    実行せずに終了した場合、あとで暴走することに
                   なります。

                ★ vsync_Delayは、VGAや98の31kHzモー
                  ドでもvsync割り込みが56.42Hz(98ノーマルモードと
                  同じ)になるように、適切な値が設定されます。ただ
                  し 98での  30行BIOSなどの拡張モードは正常に追跡
                  しません。 また、この設定をキャンセルして、実際
                  のvsyncの速度に一致させたい場合は、vsync_start()
                  実行後に vsync_Delay変数を0にしてください。
                ○ <98>VSYNC割り込み(INT 0ah)を使用しています。
                ○ タイマ割り込み(INT 08h)を使用しています。
                ★ インターバル割り込みの周期を変更している常
                   駐ソフトなどとは非常に相性が悪いでしょう。

------------------------------------------------------------------------
□ vsync_wait, vga_vsync_wait - 次のVSYNC開始を待つ

C:      void vsync_wait(void);
C:      void vga_vsync_wait(void);

        ------------------------------------------98N 98H AT DOS-
        vsync_wait                                 ○     *
        -------------------------------------------
        vga_vsync_wait                             ×  × ○
        -------------------------------------------

                ● 次の VSYNC(正確にはVBLANK,  CRT垂直帰線区間)の
                   開始を待ちます。
                    vsync_startが実行されていれば、 vsync_Count1
                   が変化するまで待ち、実行されていなければ I/Oポ
                   ートを監視して開始を待ちます。
                    すでに垂直帰線区間の最中であった場合、次の開
                   始まで待つことになります。

                ○ vga_vsync_startが実行されているのなら、
                   vsync_Count1が変化するのを待ちます。実行されて
                   いないのなら、VGAのポートからvsyncの状態を読み
                   取り、開始を待ちます。


------------------------------------------------------------------------
■ タイマ割り込み ■■■■■■■■■■■■■■■■■■■■■■■■■■■

         タイマ割り込みは、 基準周波数の整数倍の任意の周期で発生
        させることのできる割り込みです。
         ただし、基準周波数は、機種によって異なります。
         この割り込みを利用して、カウンタ変数を増加します。
         アプリケーションは、この値を0にしてから経過した時間を、
        直接変数を参照することにより知ることができます。

------------------------------------------------------------------------
□ 構造体/グローバル変数

unsigned long timer_Count;      タイマ割り込み毎に 1 ずつ増加する
                                変数です。

void (far * timer_Proc)(void);
                        タイマ割り込みルーチンから呼ばれるサブル
                        ーチンのアドレス。
                        timer_start()によって設定されます。

------------------------------------------------------------------------
□ timer_end - タイマ割り込みの使用停止

C:      void timer_end(void);

        ------------------------------------------98N 98H AT DOS-
        timer_end                                  ○     ×
        ----------------------------------------------

                ● タイマ割り込みが設定されていれば、それを解除し
                   ます。設定されていなければ何もしません。

                ★ timer_startによって呼び出しを禁止していた、 以
                   前のタイマ割り込み処理が呼び出されるようになり
                   ます。
                ★ 周期は、既定値(10ms)に設定されます。

                ★ 一度timer_startを実行したら、 プログラムを終了
                   するまでにこれを実行する必要があります。
                    これを守らなかった場合、あとで暴走することに
                   なります。

------------------------------------------------------------------------
□ timer_start - タイマ割り込みの設定およびカウンタリセット

C:      int timer_start( unsigned count, void (far *proc)(void) );

        ------------------------------------------98N 98H AT DOS-
        timer_start                                ○     ×
        ----------------------------------------------

                ● タイマ割り込みがまだ設定されていなければ、設定
                   します。
                    設定されていてもいなくてもカウンタ変数を0に
                   設定します。

                ← count   割り込みの周期
                   proc    割り込み処理ルーチンのアドレス

                → 1(True)    成功
                   0(False)   すでに timer_startが実行され、動作
                             中であるので失敗
                              この場合は timer_endを先に実行して
                             ください。

                   カウンタ変数:
                     timer_Count

                ★ 以前にタイマ割り込みとして動作していたルーチン
                   は呼び出されなくなります。

                ★ 一度設定したら、プログラムを終了するまでに
                   timer_endを実行する必要があります。
                    実行せずに終了した場合、あとで暴走することに
                   なります。


------------------------------------------------------------------------
■ 音関係 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■


------------------------------------------------------------------------
■ BEEP音関係 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

         BEEP音のon/off、および周波数の指定を行います。
         演奏を行いたい場合は、"BEEP音によるBGMと効果音の再生"項
        を参照してください。

------------------------------------------------------------------------
□ 定数

        ● beep_freq()の引数
        表記            値      意味
        SYS_BEEP_FREQ   2000    BEEP周波数のシステム既定値
        BEEP_FREQ_MIN   38      BEEP周波数の最小値
        BEEP_FREQ_MAX   65535   BEEP周波数の最大値

------------------------------------------------------------------------
□ beep_end - BEEP音の停止と周波数の復帰

C:      void beep_end(void);                               マクロ

        ------------------------------------------98N 98H AT DOS-
        beep_end                                   ○  × *
        -----------------------------------------------------<->-

                ● BEEP音を止め、周波数をシステム既定値に再設定し
                   ます。

------------------------------------------------------------------------
□ beep_freq, vbeep_freq - BEEP音の周波数を設定する

C:      void beep_freq( unsigned freq );
C:      void vbeep_freq( unsigned freq );

        ------------------------------------------98N 98H AT DOS-
        beep_freq                                  V  × *
        -------------------------------------------
        vbeep_freq                                 ×  × ○
        -------------------------------------------

                ● freqには、BEEP_FREQ_MIN ~ BEEP_FREQ_MAX  の値
                   が使えます。
                   範囲外の値を指定するとゼロ除算エラーが発生しま
                   す。
                   鳴っている最中でも指定できます。

------------------------------------------------------------------------
□ beep_off - BEEP音を止める

C:      void beep_off(void);                               マクロ

        ------------------------------------------98N 98H AT DOS-
        beep_off                                   ○     *
        -----------------------------------------------------<->-

                ● BEEP音を止めます。

------------------------------------------------------------------------
□ beep_on - BEEP音を鳴らす

C:      void beep_on(void);                                マクロ

        ------------------------------------------98N 98H AT DOS-
        beep_on                                    ○     *
        -----------------------------------------------------<->-

                ● BEEP音を鳴らします。以後止めるまで鳴り続けます。


------------------------------------------------------------------------
■ BEEP PCM関係 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■

         98内蔵のBEEP音源を利用して、量子化ビット数が8bitのPCMデ
        ータを再生します。このデータは、"SPK"として知られる形式で
        す。
         このデータをメインメモリに読み込み、pcm_convertを用いて
        再生データに変換すると、pcm_playで再生することができます。
         再生できる周波数は、一応10~40kHz?ぐらい(コンピュータの
        速度などに依存)で、通常は22kHzを用います。

------------------------------------------------------------------------
□ pcm_convert - PCMデータの変換

C:      void pcm_convert(  void far * dest, const void far * src,
                         unsigned rate, unsigned long size );

        ------------------------------------------98N 98H AT DOS-
        pcm_convert                                V  ×
        -------------------------------------------

                ● 8bitPCMデータをpcm_play用の再生データに変換し
                   ます。

                ← src  PCMデータ
                   size そのバイト数(64KBを超えてかまいません)
                   dest 変換結果の格納先(srcと一致して構いません)
                   rate 再生周期、通常はマクロ PCM_22kHz を指定し
                        て下さい。 大きな値を指定すると周期が長く
                        (再生周波数は低く)なります。しかし255まで
                        しか指定できませんので注意してください。
                        なお、 マクロ PCM_22kHzは実行時に条件判定
                        を行う文になっているので、 あらかじめ結果
                        を変数などに入れ、 それを利用すると実行形
                        式のサイズと実行時間の節約になります。

------------------------------------------------------------------------
□ pcm_play - PCMデータの再生

C:      void pcm_play( const void far * pcm,unsigned rate,unsigned long size);

        ------------------------------------------98N 98H AT DOS-
        pcm_play                                   V  × ×
        --------------------------------------------

                ● pcm_convertによって変換されたPCMデータを再生し
                   ます。
                   再生中は、 VSYNC割り込みとタイマ割り込みを禁止
                   しています。 また、 終了時に  BEEP音の周波数を
                   2kHz(既定値)に、タイマ割り込みの周期を 10ms(既
                   定値)に設定します。 rate,sizeにはpcm_convertで
                   指定した値を指定して下さい。
                   なお、実際の再生周波数はかなり大雑把です。マシ
                   ンによっても誤差が出ますので注意してください。

                ○ 音質を改善したい場合、呼び出し直前にCLI(),  直
                   後にSTI()を実行することで、多少効果があります。
                   ただし割り込みを禁止することから、演奏中はキー
                   入力や他の演奏などは止まります。


------------------------------------------------------------------------
■ BEEP音によるBGMと効果音の再生 ■■■■■■■■■■■■■■■■■■■

         BEEP音のみしか鳴らない環境においても、三重和音によるBGM
        演奏や、同時に効果音を鳴らしたりするための関数群です。
         ★この機能はDOS BOX内では何も起こりません。

         bgm_init で準備し、bgm_finishで後始末をします。

------------------------------------------------------------------------
□ 構造体/グローバル変数

        ● ステータス構造体(bgm_read_status)
typedef struct BSTAT BSTAT;
struct BSTAT {
    int music;    演奏処理 BGM_STAT_ON/OFF
    int sound;    効果音処理 BGM_STAT_ON/OFF
    int play;     演奏中か否か BGM_STAT_PLAY/MUTE
    int effect;   効果音出力中か否か BGM_STAT_PLAY/MUTE
    int repeat;   リピート演奏か否か BGM_STAT_REPT/1TIM
    int mnum;     登録曲数
    int rnum;     セレクト中曲番号
    int tempo;    現在のテンポ
    int snum;     登録効果音数
    int fnum;     セレクト中効果音番号
} BSTAT;

        ● グローバルデータ構造体
typedef struct BGM_GLB BGM_GLB;
struct BGM_GLB {
    int imr;                    インターラプト・マスク・レジスタ
    unsigned int tval;          タイマ設定値
    int tp;                     テンポ
    int rflg;                   BGM ON/OFF
    int pnum;                   パート数
    int pcnt;                   パートカウンタ
    int fin;                    パート終了フラグ
    int rep;                    リピート ON/OFF
    int tcnt;                   処理カウンタ(4回に 1回処理)
    int bufsiz;                 楽譜バッファのサイズ
    int buflast;                楽譜バッファのラスト
    int mnum;                   登録曲数
    int mcnt;                   セレクト中曲番号
    int track[BGM_MUSIC_MAX];   曲のトラックナンバー
    int mask;                   パートマスク情報
    int mtp[BGM_MUSIC_MAX];     曲ごとのテンポ情報
    int effect;                 効果音 ON/OFF
    int snum;                   登録効果音数
    int scnt;                   セレクト中効果音番号
    int music;                  演奏処理 ON/OFF
    int sound;                  効果音処理 ON/OFF
    int init;                   イニシャライズ実行フラグ
    unsigned long clockbase;    tempo120時のタイマカウント
};

        ● パート構造体
typedef struct BGM_PART BGM_PART;
struct BGM_PART {
    unsigned char far *ptr;     楽譜ポインタ
    unsigned char far *mbuf;    楽譜バッファ
    char note;                  現在の音符
    int oct;                    現在のオクターブ
    int len;                    現在の音長
    int dflen;                  デフォルトの音長
    int lcnt;                   音長カウンタ
    int mask;                   パートマスク ON/OFF
    int tnt;                    テヌート ON/OFF
};

        ● 効果音構造体
typedef struct BGM_ESOUND BGM_ESOUND;
struct BGM_ESOUND {
    unsigned int far *sptr;     効果音データポインタ
    unsigned int far *sbuf;     効果音データバッファ
};

        ● 内部管理データ実体(普通は直接操作しないでください)
BGM_GLB bgm_glb;
BGM_PART bgm_part[BGM_PART_MAX];
BGM_ESOUND bgm_esound[BGM_SOUND_MAX];

------------------------------------------------------------------------
□ 定数

        ● BGMステータス(BSTAT)構造体のメンバの値
        表記            値      意味
        BGM_STAT_ON     1       効果音/曲演奏処理ON
        BGM_STAT_OFF    0       効果音/曲演奏処理OFF
        BGM_STAT_PLAY   1       効果音出力/曲演奏中
        BGM_STAT_MUTE   0       効果音/曲演奏停止中
        BGM_STAT_REPT   1       リピート演奏をする
        BGM_STAT_1TIM   0       リピート演奏をしない

        ● bgm_read_data() の引数
        表記            値      意味
        BGM_MES_ON      1       データファイル中のコメントを表示
                                する
        BGM_MES_OFF     0       データファイル中のコメントを表示
                                しない

        ● bgm_set_mode() の引数
        表記            値      意味
        BGM_MUSIC       1       曲演奏を許可する
        BGM_SOUND       2       効果音出力を許可する

        ● 管理できる総曲数など
        表記            値      意味
        BGM_MUSIC_MAX   16      曲数
        BGM_PART_MAX    3       曲のパート数
        BGM_SOUND_MAX   16      効果音数

------------------------------------------------------------------------
□ bgm_cont_play - 曲の演奏の再開

C:      int bgm_cont_play(void);

        ------------------------------------------98N 98H AT DOS-
        bgm_cont_play
        -------------------------------------------

                ● 中断した曲の演奏を再開します。

                → NoError         正常終了
                   GeneralFailure  演奏中である

------------------------------------------------------------------------
□ bgm_finish - 演奏機能の後始末

C:      void bgm_finish(void);

        ------------------------------------------98N 98H AT DOS-
        bgm_finish                                 V  × ○ ○
        -------------------------------------------

                ● 演奏機能の後始末をします。

                ○ 最後に一度だけ実行します。

                例:
                 bgm_initを参照してください。

------------------------------------------------------------------------
□ bgm_init - 演奏機能の準備

C:      int bgm_init(int bufsiz);

        ------------------------------------------98N 98H AT DOS-
        bgm_init                                   V  × ○ ○
        -------------------------------------------

                ● 演奏機能を開始します。

                ← bufsiz  1パートあたりのバッファサイズ
                           通常は4096程度でいいですが、
                           bgm_read_data()   で曲を読み込むときに
                           InsufficientMemory  が返ってくるような
                           時に増やしてみてください。

                → NoError              成功
                   InsufficientMemory   メモリ不足

                ★ この関数を実行したら、DOSに戻るまでに必ず
                   bgm_finishを実行してください。

                ○ 内部で get_machine()を呼び出しています。
                ○ RTC割り込み(INT 70h)を使用しています。
                ○ <98>タイマ割り込みを使用しています。
                ○ 最初に一度だけ実行します。

                △MEMORY: bufsiz*3+512*16バイトのメモリを確保しま
                  す。

                例: 初期化と後始末だけの骨格
                  int main(void){
                      bgm_init(4096);     /* 初期化 */
                      bgm_finish();       /* 後始末 */
                      return 0;
                  }

------------------------------------------------------------------------
□ bgm_read_data - BGMファイルから曲データを読み込む

C:      int bgm_read_data(const char *fname, int tempo, int mes);

        ------------------------------------------98N 98H AT DOS-
        bgm_read_data                              V  × ○ ○
        -------------------------------------------

                ● 曲データを読み込みます。

                ← fname  曲データファイル名
                   tempo  その曲のデフォルトテンポ(0,30-240)
                   mes    データファイル中のメッセージを表示する
                          か否か。
                          する(BGM_MES_ON),しない(BGM_MES_OFF)

                → NoError             正常終了
                   FileNotFound        ファイルが開けない
                   InvalidData         登録曲総数が 16 曲を越えた
                   InsufficientMemory  データバッファが足りない
                   InvalidFormat       ファイルの書式が異常

                ○ 曲データには読み込んだ順番に曲番号 1,2,3,…,16
                   が付きます。以後、曲を指定するときはこの番号で
                   指定します。
                    tempo として 0  を指定するとその曲のテンポは
                   120  に設定されます。ただし,曲データ内でテンポ
                   を指定している場合はそれが最優先されます。

                △MEMORY:  一時的にファイルサイズ分のメモリを確保
                  して作業します。このため、ファイルサイズは 64KB
                  未満である必要もあります。

------------------------------------------------------------------------
□ bgm_read_sdata - EFSファイルから効果音データを読み込む

C:      int bgm_read_sdata(const char *fname);

        ------------------------------------------98N 98H AT DOS-
        bgm_read_sdata                                       ○
        -------------------------------------------

                ● 効果音データを読み込みます。

                ← fname   効果音データファイル名

                → NoError        正常終了
                   FileNotFound   ファイルオープンエラー
                   InvalidFormat  データフォーマットエラー

                ○ 効果音データには読み込んだ順番に効果音番号
                   1,2,3,…,16 が付きます。 以後,効果音を指定する
                   ときはこの番号で指定します。
                    データは 1つのファイルにあっても複数のファイ
                   ルに分かれていても構いません。また合計  16個を
                   越えた場合は無視されます。

------------------------------------------------------------------------
□ bgm_read_status - 演奏機能の状態の読み取り

C:      void bgm_read_status(BSTAT *bsp);

        ------------------------------------------98N 98H AT DOS-
        bgm_read_status
        -------------------------------------------

                ● 演奏機能の現在の状態を読み出します。

                ← bsp  状態のコピーの格納先

                ○ BSTAT構造体の内容については、 「構造体/グロー
                   バル変数」を参照してください。

------------------------------------------------------------------------
□ bgm_repeat_off - 曲のくり返し演奏を行わない

C:      void bgm_repeat_off(void);

        ------------------------------------------98N 98H AT DOS-
        bgm_repeat_off
        -------------------------------------------

                ● 演奏している曲の最後に達すると自動的に先頭から
                   演奏を続ける(リピート)機能を無効にします。

                ○ bgm_init実行後は有効になっています。

------------------------------------------------------------------------
□ bgm_repeat_on - 曲のくり返し演奏を行う

C:      void bgm_repeat_on(void);

        ------------------------------------------98N 98H AT DOS-
        bgm_repeat_on
        -------------------------------------------

                ● 演奏している曲の最後に達すると自動的に先頭から
                   演奏を続ける(リピート)機能を有効にします。

                ○ bgm_init実行後は有効になっています。

------------------------------------------------------------------------
□ bgm_select_music - 演奏する曲の選択

C:      int bgm_select_music(int num);

        ------------------------------------------98N 98H AT DOS-
        bgm_select_music                           V  × ○
        -------------------------------------------

                ● 演奏する曲を選択します。

                ← num  曲番号(1~)

                → NoError      正常終了
                   InvalidData  曲番号が異常

                ○ 選択しても演奏開始はしません。

                例:
                  int main(void){
                      bgm_init(4096);
                      /* sample.bgmをデフォルトテンポでメッセージ
                      表示OFFで読み込む */
                      bgm_read_data("sample.bgm",0,BGM_MES_OFF);
                      bgm_finish();
                      return 0;
                  }

------------------------------------------------------------------------
□ bgm_set_mode - 曲演奏/効果音出力動作の可否を設定

C:      void bgm_set_mode(int mode);

        ------------------------------------------98N 98H AT DOS-
        bgm_set_mode                               V  × ○
        -------------------------------------------

                ● 曲演奏,効果音出力の機能の有無を設定します。

                ← mode   BGM_MUSIC, BGM_SOUND の組み合わせで出力
                          の可否を指定します。

                例:
                  int main(void){
                      bgm_init(4096);
                      /* 全て機能(デフォルト) */
                      bgm_set_mode(BGM_MUSIC + BGM_SOUND);

                      /* 曲演奏のみ機能 */
                      bgm_set_mode(BGM_MUSIC);

                      /* どちらも機能しない */
                      bgm_set_mode(0);

                      bgm_finish();
                      return 0;
                  }

------------------------------------------------------------------------
□ bgm_set_tempo - 曲のテンポを設定

C:      int bgm_set_tempo(int tempo);

        ------------------------------------------98N 98H AT DOS-
        bgm_set_tempo
        -------------------------------------------

                ● 曲演奏のテンポを設定します。

                ← tempo  テンポ(30~240)

                → NoError      正常終了
                   InvalidData  範囲エラー

                ○ 演奏中でも自由に設定できます。

------------------------------------------------------------------------
□ bgm_sound - 効果音出力の開始

C:      int bgm_sound(int num);

        ------------------------------------------98N 98H AT DOS-
        bgm_sound                                  V  × ○
        --------------------------------------------

                ● 効果音を出力(開始)します。

                ← num  効果音番号(1~16)

                → NoError      正常終了
                   InvalidData  効果音番号が異常

------------------------------------------------------------------------
□ bgm_start_play - 曲の演奏の開始

C:      int bgm_start_play(void);

        ------------------------------------------98N 98H AT DOS-
        bgm_start_play                             V  × ○
        -------------------------------------------

                ● 選択されている曲の演奏を開始します。

                → NoError      正常終了
                   InvalidData  曲番号が異常

                ○ 演奏途中なら最初から演奏します。テンポはデフォ
                   ルトに戻ります。

------------------------------------------------------------------------
□ bgm_stop_play - 曲の演奏の中断

C:      int bgm_stop_play(void);

        ------------------------------------------98N 98H AT DOS-
        bgm_stop_play                              V  × ○
        -------------------------------------------

                ● 曲の演奏を中断します。

                → NoError         正常終了
                   GeneralFailure  演奏中ではない

                ○ 中断後は bgm_cont_play()  によって演奏を再開で
                   きます。

------------------------------------------------------------------------
□ bgm_stop_sound - 効果音出力の停止

C:      int bgm_stop_sound(void);

        ------------------------------------------98N 98H AT DOS-
        bgm_stop_sound                             V  × ○ ○
        -------------------------------------------

                ● 効果音の出力を中断します。

                → NoError         正常終了
                   GeneralFailure  出力中ではない

                ★ 中断した効果音を続きから鳴らすことはできません。

------------------------------------------------------------------------
□ bgm_wait_play - 演奏中の曲の終了待ち

C:      int bgm_wait_play(void);

        ------------------------------------------98N 98H AT DOS-
        bgm_wait_play
        -------------------------------------------

                ● 演奏中の曲が終わるまで待ちます。

                → NoError         正常終了
                   GeneralFailure  演奏中ではない

------------------------------------------------------------------------
□ bgm_wait_sound - 効果音出力の終了待ち

C:      int bgm_wait_sound(void);

        ------------------------------------------98N 98H AT DOS-
        bgm_wait_sound
        --------------------------------------------

                ● 効果音の出力が終わるまで待ちます。

                → NoError         正常終了
                   GeneralFailure  出力中ではない


------------------------------------------------------------------------
■ 通信関係 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■


------------------------------------------------------------------------
■ PC-9801 RS-232C関係 ■■■■■■■■■■■■■■■■■■■■■■■■

         PC-9801のRS-232Cを直接制御するルーチン集です。
         仕様は、次のようになっています。
        ---------------------------------------------------------
        通信ポート      現在は本体内蔵のみ
        通信速度        150, 300, 600, 1200,  2400,  4800,  9600,
                        19200, 31250, 38400bps
        データ長        7,8bit
        パリティ        なし,偶数,奇数
        ストップビット  1bit,1.5bit,2bit
        フロー制御      なし・XON/XOFF・RS/CSの3種類の中から一つ
                        選択
        シフト制御      なし
        送信バッファ    2048バイト・リングバッファ
        受信バッファ    6144バイト・リングバッファ、 フロー開始は
                        4096バイト溜ったとき。 満杯のときに受信し
                        た文字は捨てる。
        送信方法        送信割り込み
        受信方法        受信割り込み
        フロー制御方法  送受信割り込みで行います。 XON/XOFFフロー
                        時は、 XOFFを送信したあとはさらに文字を受
                        信するたびに XOFFを送信する仕様になってい
                        るので注意してください。
                        ソフトフロー制御のときに XON/XOFFを受信し
                        た場合、 これらの文字は受信バッファに格納
                        されずに停止/再開動作だけ行います。
        ---------------------------------------------------------

------------------------------------------------------------------------
□ 定数

        ● sio_start() の param 引数のビット要素
        表記            値      意味
        SIO_Nxx         0x00    パリティなし
        SIO_Oxx         0x10    奇数パリティ
        SIO_Exx         0x30    偶数パリティ

        SIO_x7x         0x08    データ長 7bit
        SIO_x8x         0x0c    データ長 8bit

        SIO_xx1         0x40    ストップビット長 1bit
        SIO_xx2         0x80    ストップビット長 1.5bit
        SIO_xx3         0xc0    ストップビット長 2bit

        ● sio_start() の flow 引数の値
        表記            値      意味
        SIO_FLOW_NONE   0       フロー制御なし
        SIO_FLOW_HARD   1       ハードウェア(RS/CS)フロー
        SIO_FLOW_SOFT   2       ソフト(XON/XOFF)フロー

        ● sio_start(), sio_setspeed() の speed の値
        表記            値      意味
        SIO_MIDI        128     31250bps
        SIO_38400       9       38400bps
        SIO_19200       8       19200bps
        SIO_9600        7        9600bps
        SIO_4800        6        4800bps
        SIO_2400        5        2400bps
        SIO_1200        4        1200bps
        SIO_600         3         600bps
        SIO_300         2         300bps
        SIO_150         1         150bps

        ● sio_bit_on(), sio_bit_off() の mask値
        表記            値      意味
        SIO_ER          0x02    sio_bit_on/off() DTR
        SIO_ERRCLR      0x10    sio_bit_on/off()  Errorフラグクリ
                                ア
        SIO_RS          0x20    sio_bit_on/off() RTS
        SIO_BREAK       0x80    sio_bit_on/off() ブレーク信号

        ● sio_read_err() の戻り値のビット要素
        表記            値      意味
        SIO_PERR        0x08    パリティエラー
        SIO_OERR        0x10    オーバーランエラー
        SIO_FERR        0x20    フレーミングエラー

        ● sio_read_signal() の戻り値のビット要素
        表記            値      意味
        SIO_CI          0x80    着呼検出
        SIO_CS          0x40    送信可
        SIO_CD          0x20    キャリア検出

        ● バッファサイズ定数
        表記                    値      意味
        SIO_SENDBUF_SIZE        2048    送信バッファサイズ
        SIO_RECEIVEBUF_SIZE     6144    受信バッファサイズ

------------------------------------------------------------------------
□ sio_bit_off - DTR,RTS,BREAK制御線OFF

C:      void sio_bit_off( int port, int mask );

        ------------------------------------------98N 98H AT DOS-
        sio_bit_off                                ○     ×
        ---------------------------------------------

                ● DTR,RTS,BRAK信号線のいずれか1~3本を OFF  に
                   します。

                ← SIO_ER(DTR信号), SIO_RS(RTS信号), SIO_BREAK(ブ
                   レーク信号) のどれか、 または複数を論理和(|)で
                   組み合せて OFFにする線を指定

------------------------------------------------------------------------
□ sio_bit_on - DTR,RTS,BREAK制御線ON

C:      void sio_bit_on( int port, int mask );

        ------------------------------------------98N 98H AT DOS-
        sio_bit_on                                 ○     ×
        ---------------------------------------------

                ● DTR,RTS,BRAK信号線のいずれか1~3本を ON にし
                   ます。

                ← SIO_ER(DTR信号), SIO_RS(RTS信号), SIO_BREAK(ブ
                   レーク信号) のどれか、 または複数を論理和(|)で
                   組み合せて ONにする線を指定

------------------------------------------------------------------------
□ sio_disable - (RS-232C割り込み禁止)

C:      void sio_disable( int port );

        ------------------------------------------98N 98H AT DOS-
        sio_disable                                ○     ×
        -------------------------------------------

                ● 送信・受信割り込みを禁止します。通常は呼ばない
                   で下さい。

------------------------------------------------------------------------
□ sio_enable - (RS-232C割り込み許可)

C:      void sio_enable( int port );

        ------------------------------------------98N 98H AT DOS-
        sio_enable                                 ○     ×
        -------------------------------------------

                ● 送信・受信割り込みを許可します。通常は呼ばない
                   で下さい。

------------------------------------------------------------------------
□ sio_end - RS-232C制御ルーチンの開放(1)

C:      void sio_end( int port );

        ------------------------------------------98N 98H AT DOS-
        sio_end                                    ○     × ○
        -------------------------------------------

                ● 各信号線をすべて OFF にして、sio_start  によっ
                   てフックした割り込みを解除します。また送受信割
                   り込みを禁止します。 sio_start(sio_enter) を実
                   行した場合、かならず sio_end または  sio_leave
                   を実行してください。

------------------------------------------------------------------------
□ sio_enter - RS-232C制御ルーチンの初期化(2)

C:      void sio_enter( int port, int flow );              マクロ

        ------------------------------------------98N 98H AT DOS-
        sio_enter                                  ○     × ○
        -----------------------------------------------------<->-

                ● sio_*関数群の変数などを、RS-232Cハードウェアの
                   各種パラメータを一切タッチせずに初期化します。
                   また、まだ割り込みベクタをフックしていない場合
                   はフックします。

                ← flow         フロー制御の選択。  SIO_FLOW_NONE
                                (なし),   SIO_FLOW_HARD  (RS/CS),
                                SIO_FLOW_SOFT  (XON/XOFF)のどれか
                                を指定してください。

------------------------------------------------------------------------
□ sio_error_reset - パリティエラーなどのフラグをクリアする

C:      void sio_error_reset( int port );                  マクロ

        ------------------------------------------98N 98H AT DOS-
        sio_error_reset                            ○     ×
        -----------------------------------------------------<->-

                ● 物理通信エラーフラグ(パリティ,オーバーラン,フ
                   レーミングエラー)をクリアします。

------------------------------------------------------------------------
□ sio_getc - 1文字受信

C:      int sio_getc( int port );

        ------------------------------------------98N 98H AT DOS-
        sio_getc                                   ○     ×
        --------------------------------------------

                ● 1バイトのデータを受信バッファから抜き取ります。

                → 0~255  受信したデータ
                   -1      受信バッファが空

------------------------------------------------------------------------
□ sio_leave - RS-232C制御ルーチンの開放(2)

C:      void sio_leave( int port );

        ------------------------------------------98N 98H AT DOS-
        sio_leave                                  ○     × ○
        -------------------------------------------

                ● 各信号線はそのままに、sio_start によってフック
                   した割り込みを解除します。また送受信割り込みを
                   禁止します。sio_start(sio_enter)  を実行した場
                   合、かならず sio_end または sio_leave を実行し
                   てください。

------------------------------------------------------------------------
□ sio_putc - 1文字送信

C:      int sio_putc( int port, int c );

        ------------------------------------------98N 98H AT DOS-
        sio_putc                                   ○     ×
        --------------------------------------------

                ● 1バイトのデータを送信バッファに追加します。

                → 1 成功
                   0 送信バッファが満杯なので失敗

------------------------------------------------------------------------
□ sio_putp - パスカル文字列送信

C:       unsigned sio_putp( int port, const char * passtr );

        ------------------------------------------98N 98H AT DOS-
        sio_putp                                   ○     ×
        --------------------------------------------

                ● パスカル文字列を送信バッファに追加します。

                → 1~ 格納した文字数
                   0 送信バッファが満杯なので失敗

------------------------------------------------------------------------
□ sio_puts - 文字列送信

C:      unsigned sio_puts( int port, const char * str );

        ------------------------------------------98N 98H AT DOS-
        sio_puts                                   ○     ×
        --------------------------------------------

                ● 文字列を送信バッファに追加します。

                → 1~ 格納した文字数
                   0 送信バッファが満杯なので失敗

------------------------------------------------------------------------
□ sio_read - データブロック受信

C:      unsigned sio_read( int port, void * recbuf, unsigned reclen );

        ------------------------------------------98N 98H AT DOS-
        sio_read                                   ○     ×
        --------------------------------------------

                ● 複数バイトのデータを一括して受信バッファから引
                   き取ります。

                ← recbuf       受取り先の先頭アドレス
                   reclen       最大受取り長(バイト数)

                → 引き取ることの出来たバイト数 (0~6144)
                   受信バッファが空ならば 0 になります。また、 満
                   杯のときでも最大 6144バイトしか引き取れません。

------------------------------------------------------------------------
□ sio_read_dr - DR(DSR)信号線読み取り

C:      int sio_read_dr( int port );

        ------------------------------------------98N 98H AT DOS-
        sio_read_dr                                ○     ×
        -------------------------------------------

                ● DR信号線を読み取ります。

                → 0以外 ON
                   0     OFF

------------------------------------------------------------------------
□ sio_read_err - パリティエラーなどのフラグを読む

C:      int sio_read_err( int port );

        ------------------------------------------98N 98H AT DOS-
        sio_read_err                               ○     ×
        -------------------------------------------

                ● 物理通信エラーフラグを読みます。エラーは3種類
                   あり、そのビットの組み合せで返します。これらの
                   フラグは、一度発生するとクリアするまで立ったま
                   まです。

                  SIO_PERR      パリティエラー
                  SIO_OERR      オーバーランエラー
                  SIO_FERR      フレーミングエラー

------------------------------------------------------------------------
□ sio_read_signal - CI,CS,CD信号線読み取り

C:      int sio_read_signal( int port );

        ------------------------------------------98N 98H AT DOS-
        sio_read_signal                            ○     ×
        -------------------------------------------

                ● 各信号線の情報を得ます。

                → CIがONなら SIO_CI, CSがONならSIO_CS,  CDがONな
                   らSIO_CD の各ビットの論理和を返します。結果と、
                   目的の信号線に対応した定数の論理積の結果が   0
                   でなければ ONという事になります。

------------------------------------------------------------------------
□ sio_receivebuf_len - 受信バッファ内のバイト数を得る

C:      unsigned sio_receivebuf_len( int port );           マクロ

        ------------------------------------------98N 98H AT DOS-
        sio_receivebuf_len                         ○
        -----------------------------------------------------<->-

                ● 受信バッファに溜っているデータのバイト数を得ま
                   す。

                → バイト数(0~6144)

------------------------------------------------------------------------
□ sio_sendbuf_len - 送信バッファ内のバイト数を得る

C:      unsigned sio_sendbuf_len( int port );              マクロ

        ------------------------------------------98N 98H AT DOS-
        sio_sendbuf_len                            ○
        -----------------------------------------------------<->-

                ● 送信バッファに溜っている未送信データのバイト数
                   を得ます。

                → バイト数(0~2048)

------------------------------------------------------------------------
□ sio_sendbuf_space - 送信バッファ内の空きバイト数を得る

C:      unsigned sio_sendbuf_space( int port );            マクロ

        ------------------------------------------98N 98H AT DOS-
        sio_sendbuf_space                          ○
        -----------------------------------------------------<->-

                ● 送信バッファにこれから追加できる空きのバイト数
                   を得ます。

                → バイト数(0~2048)

------------------------------------------------------------------------
□ sio_setspeed - RS-232C速度指定

C:      void sio_setspeed( int port, int speed );

        ------------------------------------------98N 98H AT DOS-
        sio_setspeed                               ○     ×
        -------------------------------------------

                ● 通信速度を変更します。送信/受信を行っている最
                   中に行うと文字が化けるので注意してください。

                ← speed        sio_startのspeed参照

------------------------------------------------------------------------
□ sio_start - RS-232C制御ルーチンの初期化(1)

C:      void sio_start( int port, int speed, int param, int flow );

        ------------------------------------------98N 98H AT DOS-
        sio_start                                  ○     × ○
        -------------------------------------------

                ● RS-232Cの各種パラメータを初期化します。 また、
                   まだ割り込みベクタをフックしていない場合はフッ
                   クします。
                    一度でもこの関数を実行したアプリケーションは、
                   終了までに必ず sio_end または sio_leave を呼び
                   出して下さい。呼び出さないと、終了してからハン
                   グアップします。

                ← port         ポート番号。0なら本体内蔵ポート。
                   speed        転送速度。SIO_150  (150bps)  から
                                SIO_38400 (38400bps) のどれか一つ、
                                または SIO_MIDI(31250bps)。なお、
                                動作クロックが   8MHz系の機種では
                                SIO_19200 と SIO_38400 を指定して
                                も SIO_9600 に丸めてしまいます。
                   param        通信パラメータ。通常はSIO_N81を使
                                用します。SIO_E72など、パラメータ
                                のすべての組み合せの定数が用意し
                                てあります。このN81などの文字列は、
                                N88BASICのOPEN(COM:)の説明を参照
                                してください。
                   flow         フロー制御の選択。  SIO_FLOW_NONE
                                (なし),   SIO_FLOW_HARD  (RS/CS),
                                SIO_FLOW_SOFT  (XON/XOFF)のどれか
                                を指定してください。

------------------------------------------------------------------------
□ sio_write - データブロック送信

C:      unsigned sio_write(int port, const void * senddata, unsigned sendlen);

        ------------------------------------------98N 98H AT DOS-
        sio_write                                  ○     ×
        -------------------------------------------

                ● 複数バイトのデータを一括して送信バッファに追加
                   します。

                ← senddata     送信するデータの先頭アドレス
                   sendlen      送信するデータの長さ(バイト数)

                → 送信バッファに追加できたバイト数 (0~2048)
                   送信バッファが満杯なら 0 になります。また、 空
                   の状態でも最大 2048バイトしか格納できません。

                ○ sio_sendbuf_space()の結果が sendlen 以上である
                   ことを確認してから sio_write()を実行すれば、か
                   ならず完全に格納できます。


------------------------------------------------------------------------
■ その他 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■


------------------------------------------------------------------------
■ その他 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

        乱数や細かいマクロがいくつか定義してあります。

------------------------------------------------------------------------
□ 構造体/グローバル変数

short SinTable8[256], CosTable8[256] ;  三角関数Sin8,Cos8の配列で
                                        す。
char AtanTable8[256] ;                  Atan8の配列です。
short SinTableDeg[360], CosTableDeg[360] ;   SinDec,CosDegの配列。
char AtanTableDeg[360] ;                AtanDegの配列。
long random_seed ;                      irandで使う乱数作業変数。

------------------------------------------------------------------------
□ Atan8 - アークタンジェント(256度系)

C:      int Atan8(int a);                                  マクロ

        ------------------------------------------98N 98H AT DOS-
        Atan8
        -----------------------------------------------------<->-

                ● 三角関数の逆正接を得ます。

                ← 傾き a は、0~255で、256が傾き y=x  に相当しま
                   す。

                → 結果の角度は、0~32になります。

                ○ AtanTable8を参照しています。

------------------------------------------------------------------------
□ AtanDeg - アークタンジェント(360度系)

C:      int AtanDeg(int a);                                マクロ

        ------------------------------------------98N 98H AT DOS-
        AtanDeg
        -----------------------------------------------------<->-

                ● 三角関数の逆正接を得ます。

                ← 傾き a は、0~255で、256が傾き y=x  に相当しま
                   す。

                → 結果の角度は、0~45になります。

                ○ AtanTableDegを参照しています。

------------------------------------------------------------------------
□ BYTE2PARA - バイト数をパラグラフ数に変換する

C:      unsigned BYTE2PARA( unsigned long bytelen );       マクロ

        ------------------------------------------98N 98H AT DOS-
        BYTE2PARA
        -----------------------------------------------------<->-

                ● バイト数を 16で割り余りがあるなら 1足す、 に相
                   当する計算をします。

                ← 1Mバイト以内のバイト数 (0~0xffff0L)

                → パラグラフ数

                ★ 範囲外の値を指定すると結果の値は信頼できません。

------------------------------------------------------------------------
□ FP2LONG - farポインタを0:0からのlongオフセットに変換

C:      long FP2LONG( void far * fp );                     マクロ

        ------------------------------------------98N 98H AT DOS-
        FP2LONG
        -----------------------------------------------------<->-

                ● farポインタを、 0:0番地からの20bitオフセット値
                   に変換して、long値として返します。

                → 20bitオフセットアドレス

------------------------------------------------------------------------
□ FPADD - farポインタにlongオフセットを加算

C:      void far * FPADD( void far * fp, long offset );    マクロ

        ------------------------------------------98N 98H AT DOS-
        FPADD
        -----------------------------------------------------<->-

                ● farポインタに任意のオフセット値を加算し、 正規
                   化します。

                → 加算結果のfarポインタ

------------------------------------------------------------------------
□ FP_REGULAR - farポインタの正規化

C:      void far * FP_REGULAR( void far * ptr );           マクロ

        ------------------------------------------98N 98H AT DOS-
        FP_REGULAR
        -----------------------------------------------------<->-

                ● farポインタを正規化した値を得ます。

                → 正規化したポインタ。ここで型が void far  *にな
                   ることに注意してください。変数を正規化する場合、
                   同じ変数に値を代入する場合でもキャストが必要で
                   す。
                  例:  void regptr(char far * p)
                     {
                         p = (char far *)FP_REGULAR(p);
                     }

                ★ ポインタの正規化とは、オフセット値が  0x0000~
                   0x000fの間になるようにセグメント値を補正するこ
                   とです。
                ★ なお、このマクロは引数 ptr を 2 度評価していま
                   すので、副作用に気を付けて下さい。

------------------------------------------------------------------------
□ FP_REGULAR_SEG - farポインタの正規セグメントを得る

C:      unsigned FP_REGULAR_SEG( void far * ptr );         マクロ

        ------------------------------------------98N 98H AT DOS-
        FP_REGULAR_SEG
        -----------------------------------------------------<->-

                ● farポインタを正規化したセグメント部分を得ます。

                → セグメント

------------------------------------------------------------------------
□ FP_REGULAR_OFF - farポインタの正規オフセットを得る

C:      unsigned FP_REGULAR_OFF( void far * ptr );         マクロ

        ------------------------------------------98N 98H AT DOS-
        FP_REGULAR_OFF
        -----------------------------------------------------<->-

                ● farポインタを正規化したオフセット部を得ます。

                → オフセット

------------------------------------------------------------------------
□ get_ds - データセグメントを得る

C:      int get_ds(void);                                  マクロ

        ------------------------------------------98N 98H AT DOS-
        get_ds
        -----------------------------------------------------<->-

                ● DS レジスタの値を得る(segread() 関数のサブセッ
                   ト風)。

                → DS レジスタの値

                ★ 厳密には DS レジスタの内容ではなく、DGROUP  セ
                   グメントの値です。Borland の C言語 Huge モデル
                   以外(マイクロソフトは全て)では、 C言語のコード
                   の中では常に DS にこの値が設定されています。

------------------------------------------------------------------------
□ iatan2 - (x,y)の角度を得る(アークタンジェント)(256度系)

C:      int iatan2( int y, int x );

        ------------------------------------------98N 98H AT DOS-
        iatan2
        ---------------------------------------------

                ● y/xのアークタンジェントを得ます。 得られる角度
                   は、 0~255となります。ただし、x,y がともに0の
                   場合、0を返します。

                ○ AtanTable8を参照しています。

------------------------------------------------------------------------
□ iatan2deg - (x,y)の角度を得る(アークタンジェント)(360度系)

C:      int iatan2deg( int y, int x );

        ------------------------------------------98N 98H AT DOS-
        iatan2deg
        -------------------------------------------

                ● y/xのアークタンジェントを得ます。

                → 得られる角度は、0~360となります。ただし、 x,y
                   がともに0の場合、0を返します。

                ○ AtanTableDegを参照しています。

------------------------------------------------------------------------
□ ihypot - 距離

C:      int ihypot( int x, int y );

        ------------------------------------------98N 98H AT DOS-
        ihypot
        ----------------------------------------------

                ● (x,y) の距離を得ます。
                    途中計算にオーバーフローが発生しなければ、結
                   果は 0 ~32767になります。結果は小数第一位で四
                   捨五入しています。

                ★ 精度が非常に低いので、誤差に注意してください。

------------------------------------------------------------------------
□ INPB, INPW - I/Oポートからの読み込み(バイト/ワード)

C:      int INPB(int port);                                マクロ
C:      int INPW(int port);                                マクロ

        ------------------------------------------98N 98H AT DOS-
        INPB
        INPW
        -----------------------------------------------------<->-

                ● I/Oポートから読み込みます。

                ○ このマクロは、Microsoft系と  Borland系の違いを
                   吸収するために存在します。これらのマクロを使う
                   ことで、どちらのコンパイラでも警告なしで通るよ
                   うなソースファイルの作成を助けます。
                ○ INPBはバイト値、 INPWはワード値(16bit)を読み込
                   みます。

------------------------------------------------------------------------
□ irand - 擬似乱数

C:      int irand(void);

        ------------------------------------------98N 98H AT DOS-
        irand
        ---------------------------------------------

                ● 擬似乱数を返します。標準ライブラリの  rand()と
                   同一仕様です。

                → 乱数 0~32767

                ○ この関数は、Borland C++ 3.1の rand()と同じ計算
                   式で乱数を生成しています。 式自体は、 seed   =
                   seed * 22695477 + 1, そしてこの結果の上位16bit
                   を、最上位ビットを落として返しています。

                ○ 標準ライブラリの srand(),rand()をそれぞれ
                   irand_init(),irand()に置換えることによって、わ
                   ずかなサイズ縮小と高速化を計ることができるかも
                   しれません。

------------------------------------------------------------------------
□ irand_init - 乱数系列の初期化

C:      void irand_init( long seedval );                   マクロ

        ------------------------------------------98N 98H AT DOS-
        irand_init
        -----------------------------------------------------<->-

                ● 乱数系列を初期化します。この値の初期値は 1  で
                   す。
                    0 を入れると、次回の irand()は 0 になり、 そ
                   の次が irand_init(1)実行直後と同じ値から始まり
                   ます。
                    この値に現在の秒などの値を入れることで、起動
                   毎にも乱数を最初から不規則にすることができます。

                ○ 標準ライブラリの srand(),rand()をそれぞれ
                   irand_init(),irand()に置換えることによって、わ
                   ずかなサイズ縮小と高速化を計ることができるかも
                   しれません。

                ○ random_seed に seedvalを設定しているだけです。

------------------------------------------------------------------------
□ isqrt - 平方根

C:      int isqrt( long x );

        ------------------------------------------98N 98H AT DOS-
        isqrt
        ----------------------------------------------

                ● x の平方根を得ます。x は、以下の範囲にないとオ
                   ーバーフローとして、0を返します。
                   0 ≦ x < 32767.5↑2
                   ( 0 ≦ x ≦ 1073709056(3FFF8000h) )
                    オーバーフローでなければ、結果は 0 ~32767に
                   なります。結果は小数第一位で四捨五入しています。
                    結果が0になった場合、入力値が0でなければオー
                   バーフローということになります。

                ★ 精度が非常に低いので、誤差に注意してください。

------------------------------------------------------------------------
□ LONG2FP - 0:0からのlongオフセットをfarポインタに変換

C:      void far * LONG2FP( long );                        マクロ

        ------------------------------------------98N 98H AT DOS-
        LONG2FP
        -----------------------------------------------------<->-

                ● 0:0番地からの20bitオフセット値であるlong値をも
                   とに、正規化されたfarポインタを作成します。

                → farポインタ

------------------------------------------------------------------------
□ MK_FP - segment,offsetからfarポインタを合成

C:      void far * MK_FP( unsigned seg,unsigned off );     マクロ

        ------------------------------------------98N 98H AT DOS-
        MK_FP
        -----------------------------------------------------<->-

                ● セグメント値とオフセット値からfarポインタを作
                   成します。
                   (BorlandのC処理系で定義されているものと同等で
                   す。MSCに存在しないので定義しています。)

------------------------------------------------------------------------
□ OUTB, OUTW - I/Oポートへの書き込み(バイト/ワード)

C:      void OUTB(int port,int data);                      マクロ
C:      void OUTW(int port,int data);                      マクロ

        ------------------------------------------98N 98H AT DOS-
        OUTB
        OUTW
        -----------------------------------------------------<->-

                ● I/Oポートに書き込みます。

                ○ このマクロは、Microsoft系と  Borland系の違いを
                   吸収するために存在します。これらのマクロを使う
                   ことで、どちらのコンパイラでも警告なしで通るよ
                   うなソースファイルの作成を助けます。
                ○ OUTBはバイト値、 OUTWはワード値(16bit)を書き込
                   みます。

------------------------------------------------------------------------
□ peekb2 - メモリからの1バイト読み出し

C:      unsigned char peekb2( int segment, int offset );   マクロ

        ------------------------------------------98N 98H AT DOS-
        peekb2
        -----------------------------------------------------<->-

                ● segment:offset 番地の 1バイトを得ます。

------------------------------------------------------------------------
□ poke2 - メモリを指定データで埋める

C:      void poke2( int segment, int offset, int c, int count);
        マクロ

        ------------------------------------------98N 98H AT DOS-
        poke2
        -----------------------------------------------------<->-

                ● segment:offset 番地から count バイト を c で埋
                   めます。

                ★ _fmemset関数を呼び出しています。この関数が付属
                   していないコンパイラではこのままでは使えません。
                   また、string.hのインクルードが必要です。

------------------------------------------------------------------------
□ pokeb2 - メモリへの1バイト書き込み

C:      unsigned char pokeb2( int segment, int offset,
                             unsigned char c);             マクロ

        ------------------------------------------98N 98H AT DOS-
        pokeb2
        -----------------------------------------------------<->-

                ● segment:offset 番地の1バイトに c  を書き込みま
                   す。

------------------------------------------------------------------------
□ SEG2FP - セグメント値をポインタに変換する

C:      void far * SEG2FP( unsigned seg );                 マクロ

        ------------------------------------------98N 98H AT DOS-
        SEG2FP
        -----------------------------------------------------<->-

                ● セグメント値 seg, オフセット値 0 の  farポイン
                   タを作成します。

                → farポインタ

------------------------------------------------------------------------
□ Sin8, Cos8 - サイン、コサイン(256度系)

C:      int Sin8(int r);                                   マクロ
C:      int Cos8(int r);                                   マクロ

        ------------------------------------------98N 98H AT DOS-
        Sin8
        Cos8
        -----------------------------------------------------<->-

                ● 三角関数の正弦、余弦を得ます。
                    角度rは、0~255で、64が直角になります。256が
                   一周になりますが、このため角度を 1バイトで持つ
                   ことが出来ます。  8bit以上の角度が渡されても、
                   8bit に丸められます。
                    結果の値は、-256 ~ 256 となります。目的のデ
                   ータとの乗算結果を 8bit 右シフトすることで、三
                   角関数との積を得ることができます。オーバーフロ
                   ーが起こり易いため、 途中計算はできるだけ long
                   整数で行うようにしてください。

                ○ この256度系の角度処理を利用することにより、 角
                   度を 8bit 値で扱うことができ、メモリ効率の向上
                   を図れます。
                ○ SinTable8を参照しています。

                ★ 精度が非常に低いので、誤差に注意してください。

                例 :
                    vx = (int)(( (long)x*Cos8(kakudo) )>>8) + cx;
                    vy = (int)(( (long)y*Sin8(kakudo) )>>8) + cy;

------------------------------------------------------------------------
□ SinDeg, CosDeg - サイン、コサイン(360度系)

C:      int SinDeg(int r);                                 マクロ
C:      int CosDeg(int r);                                 マクロ

        ------------------------------------------98N 98H AT DOS-
        SinDeg
        CosDeg
        -----------------------------------------------------<->-

                ● 三角関数の正弦、余弦を得ます。

                ← 角度rは、0~360で、90が直角になります。

                → 結果の値は、-256 ~ 256 となります。

                ○ 目的のデータとの乗算結果を 8bit 右シフトするこ
                   とで、三角関数との積を得ることができます。オー
                   バーフローが起こり易いため、途中計算はできるだ
                   け long 整数で行うようにしてください。

                ★ 精度が非常に低いので、誤差に注意してください。

                ○ SinTableDegを参照しています。

                例 :
                    vx = (int)(( (long)x*CosDeg(kakudo)  )>>8)  +
                    cx;
                    vy = (int)(( (long)y*SinDeg(kakudo)  )>>8)  +
                    cy;

------------------------------------------------------------------------
[END OF MASTER.MAN]