------------------------------------------------------------------------
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だけ使いたいとか)