|
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[]の変更を、一括処理するようにしています。 < つづく > |

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





うーん,がしがしコピー作戦ですか…確かにメモリ管理のためのメモリを浪費しない方法ですね…しかしスピード的にはむしろ不利…Z80のブロック転送命令がないとつらい技,かな?
2006/10/28(土) 午後 7:09 [ ectoyfan ]
ブロック転送命令ねぇ。 これは気を付けて使わないと、大バグの原因になるよ。 ソースブロック(SB)とデスティネーションブロック(DB)が、重なっていて、しかも アドレス的にDB>SBの時、転送時、SBのデータを破壊しながら転送する。 この場合のブロック転送は、ブロックのトップから、アドレスをディクリメントしながら転送しないとダメなんだ。 だいたいCPUのブロック転送命令は、インクリメント・タイプしかないのは、欠陥じゃないかな?。 GetArea()では、上の状況なので、使えないんだ・・。
2006/10/28(土) 午後 10:22 [ nag*sa_*ei ]
Z80のブロック転送時の重なり合いは私も痛い目に遭いました。それを機会に重なり合いを処理するブロック転送サブルーチンを作り、必ずそれを呼ぶようにしました▼MZ-BASICのメモリ管理、ちょっと難しかったけど図を書いてトレースしてみて、理解できました。一般に変数アクセスは値を参照する回数よりは値を書き換える回数の方がずっと少ないので、書き換えの都度メモリのブロック移動を行っても、放っておいて後でまとめて整理するよりは効率的という判断ですね?
2006/10/28(土) 午後 11:23 [ かの ]
>ブロック転送サブルーチンを作り・・▼そうですね、重なってる部分を先に転送し、残分を後で転送すれば問題ないですね。▼MZ-BASICのメモリ管理で、数値変数VAL,VAL1、VAL2は固定バイトですから、登録時、一度だけのメモリ移動で、後はデータの書き込みだけです。▼ストリングは長さが常に変わるので、メモリ移動が伴います。移動量を少なくする為、セグメント配置は、上位に配置しました。ベンチマークテストの為に、使う頻度から、MZ80は、STR2、STR1、STRと、2次元配列を、下位に置いたと思います。
2006/10/29(日) 午前 8:07 [ nag*sa_*ei ]
なるほど。数値変数はサイズが固定だから、登録時にデータ移動が一回発生するだけであとは上書きのみ。しかし文字列は実体の長さが変わるから頻繁にデータ移動が発生する。だから少しでも移動量が少なくなるように、文字列変数をメモリの上位に配置する、ということですね▼こういう現実をふまえて分析と地道な工夫が、MZ-BASICのパフォーマンスを支えていたんですね▼最近はマシンのパフォーマンスが桁違いに向上したので、こういう努力が必要な場面は少なくなっています。しかしエンジニアの姿勢として、引き継いで行くべきものだと思います。
2006/10/29(日) 午前 8:59 [ かの ]
LDDR じゃだめですか?まだC語のライブラリにmemcpy()がないころ,先輩に REP MOVSB を呼ぶC語から呼べるアセンブリコード書かされたことを思い出しました.(8086/PC98ですが.)src,dst,n からちゃんとDF(および再計算したアドレス)をセットするように書きました.
2006/10/29(日) 午前 11:01 [ ectoyfan ]
Ectoyfanさんへ、LDDR は While(BC !=0){*DE−−=*HL−−; BC−−; }ですか、有ったんですね。 僕は、8008、8080でMZ−BASIC書き始め、途中からZ80インストラクションに置き換えて行ったので・・。もっとZ80を使い切れば、MZはMSの倍近いスピードだったので 更に+αとなったでしょうね。Z80は『インテルの傘の下に咲いた アダ花・・』と言って、会社で不評をかいましたが・・。命令に因っては、マシンサイクルが遅くなるインストラクションも有りましたから・・。
2006/10/29(日) 午後 0:26 [ nag*sa_*ei ]
メモリ管理は,とくにOSがお世話してくれない環境下(組み込みマイコンなど)では必修技術ですよね.一方,学校で習う理想の話もまるっきり役立たずでもないので,両方を学べるといいのにといつも思います.とはいえ,平気で4重5重のループ書いたり,c語のローカル変数に何十メガの配列とろうとしたり,「リソース感覚」のない学生(後輩でしたが)には唖然とさせられました.
2006/10/29(日) 午後 11:24 [ ectoyfan ]
> c語のローカル変数に何十メガの配列とろうとしたり,「リソース感覚」のない学生▼私も部下の新人がこれをやっているので「おめ、それぢゃスタックあふれるべ」と注意したら「スタックってなんですか?」と真顔で聞かれて、めげました▼中西さんは以前のメッセージの中で、MZ-BASICの高速化のためにスタックをいじりまくったとおっしゃっていました。いまの若い子たちにそのソースを読ませてみたいものです…って、Z-80のアセンブラなんか見せてもそもそもわからんか。^^;
2006/10/30(月) 午前 0:02 [ かの ]
そうですね、色々な状況に対応するには、物事を、下から上からと大局的に掴まないとね、全部が見えにくいと思いますよ。それには、教育面の問題が有るのでは・・、大学も、入試科目を減らし、知識の巾が狭いのも一因かな・・、僕たちの時代の様に、文理関係なく5教科8科目 丸覚えでもやると、今でも、理系で有りながら、文学、漢文、歴史の知識が 役立ってると自覚する時も有りますよ。物事を解析・判断する場合、総合力・博学・知見・知識が、源泉ですからね。
2006/10/31(火) 午前 11:39 [ nag*sa_*ei ]
>「スタックってなんですか?」と真顔で聞かれて、めげました アハハ、さもありなんですね。ヒープといえば通じるかも。 まぁ冗談はともかく、半田ごてすら握った事の無い、電子工学部の学生もいたりする御時勢です。技術立国日本も長くはないですね…。
2006/10/31(火) 午後 0:11 [ Krik ]
> 技術立国日本も長くはないですね…。▼おっしゃるとおり。しかし座して死を待つのも気に食わんです。なんとかせねば。
2006/10/31(火) 午後 6:46 [ かの ]
> 技術立国日本も長くはないですね…。▼モノ作りの喜びを知ってほしいですね。半田付けをした事の無い、新入社員が大半ですからね。▼僕は唖然としたのは・・、回路技術者志望学生の面接で、日本橋(東京アキバの電子部品街のような所)に時々行くんですかと聞いたら・・行った事ないって・・、即刻、面接を中断して、帰えらした。▼今 大学はソフトしか教えられ無いと言っていた。 部品とか・・買ってモノを作らせる予算が無いらしい。▼▼なんと言ったって、技術者は職人でなきゃ・・ネ。
2006/10/31(火) 午後 7:38 [ nag*sa_*ei ]
> なんと言ったって、技術者は職人でなきゃ・・ネ。▼そうですよね。でも、バブルのときはコツコツと経験を積み上げて腕を磨く人たちを軽んじていたし、その後の不景気に入ると今度は予算がないからと冒険をさせなくなった。オマケに給料が高いからと中高年の経験者を追い出したたので、冒険どころか普通の経験すらさせられなくなった。▼失われたのは10年なんていう年数では計れない大きなものですね。
2006/11/1(水) 午前 10:40 [ かの ]
¶失われたのは10年なんていう年数では計れない大きなものですね。¶ 本当に失われたのは、叩上げの方々のノウハウ数十年分です。 これ無くしては、新興工業国・特に日本からの技術窃盗に余念が無い、某半島人と同程度まで、実力が退化してしまいます。 こんな簡単なんな事が、銭勘定しか能の無い愚者どもには判らない。 全く…。
2006/11/1(水) 午後 1:28 [ Krik ]