DOS2のマッパ拡張メモリ管理

※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

  • DOS2の拡張メモリ管理

DOS2環境には拡張メモリに関するBIOS(API)が用意されている。APIはROMBIOSとして
搭載されているのでDOS2環境では外付けカートリッジが必須。このAPIを使うことでDOS側で
拡張メモリのセグメント管理や切替が可能。独自のルーチンを作る必要はない。
DOS2のメモリ管理APIは基本的にDOS環境を前提としている。

拡張メモリ管理機能はDOS2のROMBIOSとして実装されている。既存のハードにDOS2拡張する場合は外付けカートリッジを搭載する。
初めからハードでDOS2環境が動作するTRなどは内部にBIOSROMが記録されている。
これらはDOS2が動作するハード環境にROMファームウエアAPIが搭載されているもので、
DOSファンクションコールとして実装されているわけではない。

DOS2の拡張メモリ管理APIはROMに記録されたAPIと、ワークエリアに設けられたセグメント管理
テーブルにより構成される。
システム管理領域にセグメント管理テーブルが記録されているがこれらのアドレスは動的に変化
するので取得には手順がある。
セグメント管理テーブルは内容は以下のようなもの(正確ではないが)。

struct {
	unsigned char slotaddr;
	unsigned char totalsegnumber;
	unsigned char freeseg;
	unsigned char alllocatedseg;
	unsigned char userallocatedseg;
	unsigned char reserve[4];
};

API機能は、セグメントの割り当てと開放、バイト単位のリードライト、拡張メモリ
セグメント内のマシン語コードの実行、低レベルのダイレクトなセグメントページング割り当てなどがある。
APIのエントリアドレスも不定なので取得の手続きがある。
関数名は以下のようなものがある。

ALL_SEG, 拡張メモリのアロケート(malloc)
FRE_SEG, free
RD_SEG, メモリのリード
WR_SEG, メモリのライト
CAL_SEG, 機械語実行
CALLS, 機械語実行

malloc/freeはCライブラリ関数のmalloc/freeと同じだが、メモリの確保はバイト単位ではなく
16KBのセグメント単位である。
またセグメントのmallocはユーザー/システムセグメントを区別でき、複数のマッパ拡張メモリが
搭載されている場合は未使用のセカンダリ拡張メモリマッパ(通常は異なる別スロットにある)も
アロケート対象とすることができる。

アセンブラとして呼ぶ事も出来るが(APIはアセンブラ利用を想定している)利用方法はBIOSのAPIを
直接コールするのではなくCの関数としてAPIをラップするほうが便利。
基本的な使用法は初めに必要なメモリブロックをヒープからアロケートし、使い終わったら
freeで開放する。セグメントの管理はAPIに任せられるが、一定のセグメントブロックをアプリ側で
使っている場合はセグメント番号はアプリ側で持っておく必要はある。
(malloc/freeのようにメモリポインタを保持するようにfree対象のセグメントも指定する必要があるので)


  • API/管理テーブルエントリの取得

セグメント管理テーブルのアドレスとAPIエントリのアドレスは拡張BIOSコールEXTBIO
(0xFFCA)を経由してチェックする。
使い方は簡単で単に値をセットして戻り値をチェックする。C関数のラッパを書けば
Cから呼び出すことは可能だ。
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。