|
MZメモリ管理について、構造をご理解していただく為、初期化とストリングの代入例の説明をします。 以前のMZ80シリーズも、略 これに近い形で、作っておりました。 30年振りのリバイバルです・・。 今回 MZメモリは、Cの領域外に設定して、MenManage.cファイルの処理関数で管理しています。 起動時メモリの初期化InitializeMemory()と 実行(RUN)時のメモリの初期化RunInit()を抜き出しました。 まず、領域は、6,7行のMemoryStartとMemoryEndで、定義しております。 エリア64Kバイトも? 多すぎ?、じゃ MemoryEnd=0x217FFFにすれば、32Kバイトになるよね。 8,9行で、BASE 〜 TOPの値・・メモリを分割する セグメント名前を定義します。 10行で、番地データの配列を宣言しています。各セグメントの開始アドレスが格納されます。 初期化 InitializeMemory();を実行した場合、Segment[BASE]〜Segment[TOP]まで、MemoryStart値に +2 しながら値を代入する。 それを間接アドレスとして、MZメモリ内に、0x0000を書き込む。 なお、RUN命令が発行された時、TEXTデータ(LIST領域)以外を、初期化して、テキストを実行します。 変数名Cは、セグメントの区別で、C,C(3)、C (3,4)、C$、C$(2)、C$(2,5)の変数形が使用できます。 今 例えば C$を格納する場合に付いて説明すると、変数のヘッダー部の最初のワードは、名前。次の ワードは、ヘッダーを含めた総バイト数、・・の形式です。 今 ヘッダーを含めた総バイト数を38とすると、 ヘッダーは0x0043, 0x0026,・・の並びになりますね。 一方、Segment[STR]はメモリ上のストリング名の位置を示しているので、そのデータが0x0000ならば、 データなしだから、新規に書き込む事になります。 Segment[STR]番地から、38バイト分メモリを上方に 移動(メモリ領域を空ける)させ、C$のデータを埋め込みます。 また、それより上位のSegment[STR1] 〜Segment[TOP]のアドレスの値は+38される事になります。 次にC$の内容が変わった時、Segment[STR]を起点に名前0x0043を探します。違う場合、総バイト数を 加算して 次の名前は?・・と走査します。 一致した時 C$データファイルのC$実体部分にアドレスに 移動し、ストリングの増減量分のメモリ獲得、または解放を行いC$実体データを埋め込みます。 そしてヘッダー部の総バイト数を修正し、それより上位のSegment[STR1] 〜Segment[TOP]のアドレスの 増減変更で、完了です。 空きメモリは、MemoryEnd− Segment[TOP]です。 必要なバイト数を取るとSegment[TOP]の値が 上昇し、バイト数が解放されると、Segment[TOP]の値が下降します。 不要になったメモリは常に 空きメモに加えられます。 不明?な メモリエリアは存在しません。 メモリへのByteアクセス ReadByte(unsigned long Adr) 、WriteByte(unsigned long Adr,unsigned char Byte) メモリ獲得のGetArea( StartAdress, Size)、解放のFreeArea(StartAdress, Size), 及び メモリ領域の残量が チェックできる CheckMemory( Size)は、今回、 紙面の都合で、割愛しました。 尚 GetArea()、FreeArea()は、メモリの領域の増減とSegment[]の変更を、一括処理するようにしています。 < つづく > |

- >
- コンピュータとインターネット
- >
- コンピュータ
- >
- パソコン




