第 5 章 インタフェースモジュール制御 80
5.3 I/O アクセス・メモリアクセス
5.3.3 DOS 用 4GB メモリアクセスユーティリティ
4GBメモリアクセスユーティリティの概要, 使用方法を説明します。
製品名 4GBメモリアクセスユーティリティ 実行ファイル名 FBIMEM4G.COM
収録ディレクトリ ¥IFCM¥DRIVERS
■概要
DOSのREALモードでは、CPUのセグメントリミットが64KBに制限されるため、32ビットレジス
タ(EBX, ESI, EDI)による1MBを超えるメモリ空間へのアクセスは、例外が発生します。
DOS System開発らくらくパッケージに収録されている、FBIMEM4G.COMの実行に
より、1MBを超えるメモリ空間へのアクセスが有効となります。
FBIMEM4G.COMはメモリ常駐タイプです。コンベンショナルメモリを約2KB使用します。
注意
!
CPUモードが仮想86モードの時は4GB空間にアクセスできません。
CPUのGDTを変更するアプリケーションは動作しません。
FBIMEM4G.COMを実行していない状態で、4GBの領域にアクセスするとコンピュータがハン グアップするのでご注意ください。
5.3.4 1MB 以上のメモリ空間へのアクセス
FBIMEM4G.COMの実行により、4GBメモリ空間へのメモリアクセスができます。
DOS System開発らくらくパッケージの総合ライブラリを使用することで、メモリア クセスを行います。
総合ライブラリのAPI関数をプログラム上から使用する場合は「include」ディレクトリ内の
「IFCM.H」を使用し、「lib」ディレクトリ内からご使用のコンパイラ, メモリモデルに合った総 合ライブラリをリンクして使用してください。
■ライブラリ関数一覧
No. 関数名 機 能
1 UioPeekByte 指定したメモリから1バイト(8ビット)データを読み込みます。
2 UioPeekWord 指定したメモリから1ワード(16ビット)データを読み込みます。
3 UioPeekDword 指定したメモリから1ダブルワード(32ビット)データを読み込みます。
4 UioPokeByte 指定したメモリに、1バイト(8ビット)データを書き込みます。
5 UioPokeWord 指定したメモリに、1ワード(16ビット)データを書き込みます。
6 UioPokeDword 指定したメモリに、1ダブルワード(32ビット)データを書き込みます。
7 UioWriteBlock 指定したメモリに、ブロックデータを書き込みます。
8 UioReadBlock 指定したメモリからブロックデータを読み込みます。
9 UioFillByte 指定したメモリにバイトデータを指定回数分、書き込みます。
10 UioFillWord 指定したメモリにワードデータを指定回数分、書き込みます。
11 UioFillDword 指定したメモリにダブルワードデータを指定回数分、書き込みます。
12 UioEnableCache 外部メモリの指定した領域のメモリキャッシュを有効にします。
13 UioDisableCache メモリ領域へのキャッシュを無効にします。
14 UioMemCopy 指定したメモリ領域から指定サイズ分データをコピーします。
15 UioMemAreaInit 連続メモリ領域確保のための初期化動作を行います。
16 UioMemAlloc メモリ領域の確保を行います。
17 UioMemFree 確保しているメモリ領域の開放を行います。
18 UioMemContArea 現在確保できる最大連続メモリ領域のサイズを取得します。
■ライブラリ関数個別説明
1. UioPeekByte
【機能】
指定したメモリから1バイト(8ビット)データを読み込みます。
【書式】
#include "IFCM.h"
unsigned char IFCDECL far UioPeekByte ( unsigned long _address
);
【パラメータ】
_address データを読み込むメモリのアドレスです。
【戻り値】
処理が正常に終了すると読み込まれたデータの値を返します。
【記述例】
メモリアドレス00400000hのデータをバイト単位で読み込みます。
ReadData = UioPeekByte(0x00400000L);
2. UioPeekWord
【機能】
指定したメモリから、1ワード(16ビット)データを読み込みます。
【書式】
#include "IFCM.h"
void IFCDECL far UioPeekWord ( unsigned long _address );
【パラメータ】
_address データを読み込むメモリのアドレスです。
【戻り値】
処理が正常に終了すると読み込まれたデータの値を返します。
【記述例】
メモリアドレス00400000hのデータをワード単位で読み込みます。
ReadData = UioPeekWord(0x00400000L);
3. UioPeekDword
【機能】
指定したメモリから、1ダブルワード(32ビット)データを読み込みます。
【書式】
#include "IFCM.h"
unsigned long IFCDECL far UioPeekDword ( unsigned long _address
);
【パラメータ】
_address データを読み込むメモリのアドレスです。
【戻り値】
処理が正常に終了すると読み込まれたデータの値を返します。
【記述例】
メモリアドレス00400000hのデータをダブルワード単位で読み込みます。
ReadData = UioPeekDword(0x00400000L);
4. UioPokeByte
【機能】
指定したメモリに、1バイト(8ビット)データを書き込みます。
【書式】
#include "IFCM.h"
void IFCDECL far UioPokeByte ( unsigned long _address, unsigned char _data );
【パラメータ】
_address データを書き込むメモリのアドレスです。
_data 書き込むデータです。
【戻り値】
戻り値はありません。
【記述例】
メモリアドレス00400000hへバイトデータ(FFh)を書き込みます。
UioPokeByte(0x00400000L, 0xFF);
5. UioPokeWord
【機能】
指定したメモリに、1ワード(16ビット)データを書き込みます。
【書式】
#include "IFCM.h"
void IFCDECL far UioPokeWord ( unsigned long _address, unsigned short _data );
【パラメータ】
_address データを書き込むメモリのアドレスです。
_data 書き込むデータです。
【戻り値】
戻り値はありません。
【記述例】
メモリアドレス00400000hへワードデータ(FFFFh)を書き込みます。
UioPokeWord(0x00400000L, 0xFFFF);
6. UioPokeDword
【機能】
指定したメモリに、1ダブルワード(32ビット)データを書き込みます。
【書式】
#include "IFCM.h"
void IFCDECL far UioPokeDword ( unsigned long _address, unsigned long _data );
【パラメータ】
_address データを書き込むメモリのアドレスです。
_data 書き込むデータです。
【戻り値】
戻り値はありません。
【記述例】
メモリアドレス00400000hへダブルワードデータ(FFFFFFFFh)を書き込みます。
UioPokeDword(0x00400000L, 0xFFFFFFFFL);
7. UioWriteBlock
【機能】
指定したメモリにブロックデータを書き込みます。
【書式】
#include "IFCM.h"
void IFCDECL far UioWriteBlock ( unsigned long _address, void far *_data, unsigned long _length );
【パラメータ】
_address データを書き込むメモリ領域の先頭アドレスです。
*_data 書き込むデータを格納する変数へのfarポインタです。
_length 書き込むサイズ(バイト単位)です。
【戻り値】
戻り値はありません。
【記述例】
メモリアドレス00400000hへ配列データを16バイト書き込みます。
UioWriteBlock(0x00400000L, *data, 0x10);
8. UioReadBlock
【機能】
指定したメモリにブロックデータを読み込みます。
【書式】
#include "IFCM.h"
void IFCDECL far UioReadBlock ( unsigned long _address, void far *_data, unsigned long _length );
【パラメータ】
_address データを読み込むメモリ領域の先頭アドレスです。
*_data 読み込むデータを格納する変数へのfarポインタです。
_length 読み込むサイズ(バイト単位)です。
【戻り値】
戻り値はありません。
9. UioFillByte
【機能】
指定したメモリにバイトデータを指定回数分、書き込みます。
【書式】
#include "IFCM.h"
void IFCDECL far UioFillByte ( unsigned long _address, unsigned long _count, unsigned char _data );
【パラメータ】
_address データ書き込みを開始するメモリ領域の先頭アドレスです。
_count 書き込みを行う回数です。
_data 書き込むデータです。
【戻り値】
戻り値はありません。
【記述例】
メモリアドレス00400000hから16バイトデータ(FFh)を書き込みます。
UioFillByte(0x00400000L, 0x10, 0xFF);
10. UioFillWord
【機能】
指定したメモリにワードデータを指定回数分、書き込みます。
【書式】
#include "IFCM.h"
void IFCDECL far UioFillWord ( unsigned long _address, unsigned long _count, unsigned short _data );
【パラメータ】
_address データ書き込みを開始するメモリ領域の先頭アドレスです。
_count 書き込みを行う回数です。
_data 書き込むデータです。
【戻り値】
戻り値はありません。
11. UioFillDword
【機能】
指定したメモリにダブルワードデータを指定回数分、書き込みます。
【書式】
#include "IFCM.h"
void IFCDECL far UioFillDword ( unsigned long _address, unsigned long _count, unsigned long _data );
【パラメータ】
_address データ書き込みを開始するメモリ領域の先頭アドレスです。
_count 書き込みを行う回数です。
_data 書き込むデータです。
【戻り値】
戻り値はありません。
【記述例】
メモリアドレス00400000hから4ダブルワードデータ(FFFFFFFFh)を書き込みます。
UioFillDword(0x00400000L, 0x04, 0xFFFFFFFFL);
12. UioEnableCache
【機能】
外部メモリの指定した領域のメモリキャッシュを有効にします。
【書式】
#include "IFCM.h"
void IFCDECL far UioEnableCache ( unsigned long _address, unsigned long _size );
【パラメータ】
_address メモリキャッシュを有効にするメモリの先頭アドレスです。
_size メモリキャッシュを有効とするメモリサイズ(バイト)です。
【戻り値】
戻り値はありません。
【記述例】
メモリアドレス00400000hから10000hバイト分のメモリキャッシュを有効にします。
UioEnableCache(0x00400000L, 0x00010000L);
【備考】
外部メモリ(メインメモリ以外)を指定してください。
キャッシュが有効にできるサイズ指定は、最小4096バイト(1000h)から実装メモリの最大有効 サイズまでです。また4096の倍数で指定する必要があります。(1000hのn倍で指定する。) 実行環境により使用できるメモリの最大有効サイズは異なります。
13. UioDisableCache
【機能】
メモリ領域へのキャッシュを無効にします。
【書式】
#include "IFCM.h"
void IFCDECL far UioDisableCache ( unsigned long _address, unsigned long _size );
【パラメータ】
_address UioEnableCache関数で指定したメモリの先頭アドレスです。
_size UioEnableCache関数で指定したメモリサイズ(バイト)です。
【戻り値】
戻り値はありません。
【記述例】
メモリアドレス00400000hから10000hバイト分のメモリキャッシュを無効にします。
UioDisableCache(0x00400000L, 0x00010000L);
【備考】
UioEnableCache関数でキャッシュを有効にしたアドレス, サイズを指定してください。
14. UioMemCopy
【機能】
指定したメモリ領域から指定サイズ分データをコピーします。
【書式】
#include "IFCM.h"
void IFCDECL far UioMemCopy ( unsigned long _raddress, unsigned long _waddress, unsigned long _size );
【パラメータ】
_raddress 読み込み先の先頭アドレスです。
_waddress 書き込み先の先頭アドレスです。
_size 転送するサイズ(バイト)です。
【戻り値】
戻り値はありません。
【記述例】
メモリアドレス00400000hから10000hバイト分のデータをメモリアドレス00100000hへ書き込み ます。
UioMemCopy(0x00400000L, 0x00100000L, 0x00010000L);
15. UioMemAreaInit
【機能】
連続メモリ領域確保のための初期化動作を行います。
【書式】
#include "IFCM.h"
unsigned long IFCDECL far UioMemAreaInit ( void
);
【パラメータ】
パラメータはありません。
【戻り値】
処理が正常に終了すると確保できる最大のメモリサイズを返します。処理が異常終了すると0を 返します。
【記述例】
連続メモリ領域確保のための初期化動作を行います。
ret = UioMemAreaInit();
【備考】
本APIを実行するには最低65MB以上のメモリ空き領域が必要です。本APIを実行し得られた最大 メモリサイズ+1MBまでをシステムの管理領域として使用します。
システム管理領域へ直接データを書き込んだ場合、本APIでのメモリの管理が正しく行われなく なります。
また、UioMemAreaInit関数を実行後、UioMemAlloc関数を実行してください。
注意
!
DOS System起動時に表示されるバージョンがVer.1.50以下の場合、本関数は 弊社DOS専用ライブラリ(GPDシリーズ)とは併用できません。Ver.1.60以上の場合、この制限 はありません。
16. UioMemAlloc
【機能】
メモリ領域の確保を行います。
【書式】
#include "IFCM.h"
unsigned long IFCDECL far UioMemAlloc ( unsigned long _MemSize
);
【パラメータ】
_MemSize 確保するメモリサイズ(64KB単位)です。
【戻り値】
処理が正常に終了すると割り当てられた登録ハンドル(メモリの上位アドレス)を返します。処理 が異常終了すると0を返します。
【記述例】
メモリ領域に10000hの連続領域を確保します。
handle = UioMemAlloc(0x10000L);
メモリアクセスできる領域は、ハンドルからサイズ分引いたアドレスとなります。
MemAddress = (handle) – (0x10000L) 確保したメモリ領域にアクセスします。
UioPokeByte(MemAddress, 0x55);
【備考】
UioMemAreaInit関数を実行後、UioMemAlloc関数を実行してください。
確保できるメモリの最小単位は64KBです。
また64KB未満の値は切り捨てられます。(例:11000h → 10000h)
【注意】
確保した メモリ領域 0DDE0000h
0CDE0000h
1000000h
00000000h FFFFFFFFh
メモリから指定サイズ分(01000000h)メモリ確保する場合、UioMemAlloc(0x1000000)と指定します。
この時handleとして0DDE0000hが返った場合、確保した領域の先頭アドレスは、
handle(0DDE0000h) − サイズ(01000000h)で0CDE0000hとなり、0CDE0000hから01000000hサイズ