質問 と 回答 のコーナー ◎前々から気になっていたんですけど、turboBASICから付加されたバンクメモ リなるもの。マニュアルを見るとバンク切り替えにより&H0000〜&H7FFF番地までの メモリがそっくり代わってしまうらしいけど、イマイチ使い方が分かりません。 そこで質問です。 (1)切り替わったバンクというのはメインメモリと同様のノーウエイトでアクセス できるのでしょうか? (2)各BASIC(CZ-8FB01〜03)時におけるバンクメモリの使用状況はどうなっ ているのでしょうか? (3)バンクメモリにプログラムを置いておき、必要に応じてバンクを切り替えその サブルーチンを呼ぶ(当然呼ぶ側は&H8000〜以降に置く)などということはで きるのでしょうか? (4)あとバンクメモリを使う時に注意することはありますか? ちょっと抽象的な質問かも? #98 松下 篤根 浜松市 <X1turbo バンクメモリについての考察> X1turboのバンクメモリとは、メモリ空間 0000H〜 7FFFH を、通常使用するメモリを切り離して別のメモリを割 り当てるもので、32Kバイト単位(これをバンクと言いま す)で最大16バンク、合計512Kバイトのメモリが接続 できます。turboZ2以降の機種では、この内2バンク(バン ク0,1)が内蔵されています。それでは質問に答えつつ、 バンクメモリの使用方法について考察してみましょう。 (1)バンクメモリはノーウェイトで動作します。turboでは、 BIOS ROMもノーウェイトのようです。 (2)BASIC でのバンクメモリの使用状況は、 ・CZ-8FB01,8FB02 ... 使用していない。 ・CZ-8FB03 ... FM音源関係の処理ルーチン、FM 音源のトラックバッファ、多色モー ド時のハードコピールーチンなどの プログラムが使用しています。残り は変数エリア(VDIM)として利用可能。 (3)バンクメモリの上手な使い方 RST 命令を使用すると、8000H番地〜に限らず、任意のアド レスからバンクメモリ上のプログラムをコールできます。 例)RST 10H でバンクメモリ上のサブルーチンをコールする。 バンクメモリ上のプログラムは、あらかじめ(8000H以降 に書かれたローダで)ロードされているものとする。 ただし、BC = CALLしたいバンクメモリのアドレス A = バンクNo.(0〜15) < MAIN側 > < BANK 0〜15 > -------------------------- -------------------------- 0010H CALL 0013H ... ... 0013H PUSH BC 0013H LD BC,0B00H LD BC,0B00H LD A,10H NOP OUT (C),A OUT (C),A 001AH RET 001AH RET 無印turbo を買って間もない頃、BASIC(8FB02)中にこのルー チン(ただしBIOS ROMをコールするプログラム)を見つけたと きは、いたく感服したことを記憶しています。 (4)注意点 バンクメモリを使用するときは、スタックと割り込みベク トルの位置にはくれぐれも注意してください。 ( SP,I ともに F800H 位が適当ではないでしょうか) ◎質問があるのですが・・・。 1.PC−8801FEでSWORDでRAMDISKを使いたいのですが、 Oh!MZ‘87.5月号を見て改造してFORMAT_Eしてみると画面に文字が 表示されなくなった(最後の画面のままで止まってる)。カーソルは動くし・・、な ぜなのでしょう。 2.S−OS NETにアクセスすると、CONNECTと出てつながるのにそれ以 上何も出ない。それもしょっちゅうです。 3.S−OSユーザーズクラブの活動内容を教えてください。 4.S−OS通信は何カ月ごとに発行するのでしょうか? #190 前田 研也 兵庫県 <まとめて回答> 1.「通信」の88用システムはオールRAM版″SWORD″の ため,RAMディスクは組み込まれておりません.「変身セット」 の改造記事は旧バージョン″SWORD″用のため,注意して移 植しないと暴走の可能性があります. 88のグラフィックRAMをデータ領域として使用する場合, メインメモリ空間にGRAMをもってくるため,サブルーチンや スタックの位置などに注意が必要です. 88シリーズも後期の機種では,メモリのお化けといった感じ で,これらのRAMを使用するRAMディスクが非公式に存在し ています.私は拡張RAM(Mシリーズに装備)を使用したRA Mディスクを作って現在使っていますし,サウンドボードIIのP CMメモリを使用したRAMディスクもあります.機会があれば, 本誌で紹介したいと思います. 2.昨年は非常に忙しかったので,ホストを2〜3か月の間復旧で きない時期がありました.深くおわびいたします. 3.「事務局からのお知らせ」をお読みください.ぜひとも,一度 ミーティングへのご参加を! 4.全く,決まっていません.出せるときに出す,以上です. ◎「S−OS通信Vol.4」ありがとうございます。我が愛機PC-8801MK2MRを破格 で売り飛ばして以来、Oh!Xを買うこともなくなり、S−OS自体を忘れていまし た(すいません)。それが突然、分厚い「S−OS通信」を見て、サポートの良さを 改めて認識しました。  前回(Vol.2)の時は88用のS−OSが同封されていたので1カ月ほど使用 していたのですが手放してしまい、98用のS−OS(Oh!Xにあったらしいが良 く知らない)が32bitのDAで使えるのかどうかが不安です。Vol.4にもPC -9801のことが書かれていないのですが、本当にあるのでしょうか?また、いくらの 実費を払えばいいのでしょうか? #135 熊野 光男 福井県 ◎最近98ばかりでX1は死んでましたが、ひさしぶりに生き返りました。S−OS  FDありがとうございます。MAGICによるオープニング、すばらしかったです ねぇ。  ところで、質問と希望が少し。 ・PC−9801用のS−OSエミュレータはあるのでしょうか。また、貴クラブで 配布しておられますか。 ・S−OSもすばらしいですが、同じく斜陽となっているCP/Mも取り扱いして もらえませんか。M80とかフリーウェアもあり、88・X1・FM−7・MSX− DOSで使えるのでは? #133 立野 信也 京都府  PC−286版″SWORD″は存在します(Oh!X90年 6月号)が,RUN&SUBMIT(変身セット)未対応および 漢字表示不可のため,現在のところ「S−OS通信」ではサポー トしておりません.今では386マシンが圧倒的台数を占めてい る訳ですから,S−OS U.C.としても取り組んでいかなければ ならないと考えていますが,スタッフ不足により手が回らないの が現状です.(石を投げないで!) 「求む!PC−286/386サポート部隊!」 CP/M環境も,ISHやARC(R),または画像ローダなど ソフトウェアが多数開発されており,魅力ある環境ですが(Oh !X誌上で石上氏がやっている一連の記事は,″SWORD″に CP/Mの環境を持ってくる事を狙ったものと考えられる),な にぶん現在の少ないスタッフでは何もかもできませんので,CP /M担当の人材が欲しいところです.できれば,I−DOSや C−DOS2にも取り組みたいですね(課題が多すぎて...). 「C・P・M,3人寄ればサポートスタッフ!」(何のこっちゃ?) ◎昔っから気になっていたんですが、Oh!Xでは時々ローダを使ったプログラムが 掲載されますよね(超小型エディタTED−750とかZ80用浮動小数点演算パッ ケージSOROBANとか)。  あれって、まぁローダを通してですが好きなアドレスに配置し実行できるわけでし ょ?一体、何であんな芸当ができるのでしょうか?何故、このローダがあるのにWZ DとWLK、WLBが必要なんでしょうか?そのあたりを重点的に掘り下げて教えて ください。 #98 松下 篤根 静岡県 <Z80でのリロケータブル・オブジェクトについて> Z80の命令には, LD A,(8010H) とか, JP 8000H などの絶対番地でアドレスを指示するものがあります.これらを 「直接アドレッシング」とか「絶対ジャンプ」と言います. それに対して, LD A,(IX+e) や DJNZ e などの命令は,現在のIXレジスタやPCレジスタの内容に,1 バイトの定数eを足したアドレスでメモリをアクセスするため, 「間接アドレッシング」(この場合インデックス付き)や「相対 ジャンプ」と呼ばれます. また「同じオブジェクトを異なるアドレスにロードして実行で きる」ことを「リロケータブル」(再配置可能)といいます. Z80のコードにより,オブジェクトレベルでリロケータブル なプログラムを作成するためには,使用する命令を後者に限定し なければなりません.しかし,相対ジャンプやインデックスの修 飾子(e)の値は−128〜+127の範囲に限られてしまいま す.しかもZ80には相対コールの命令がありません.それでも ″SWORD″には#GETPCや[HL]といったサブルーチ ンが用意されていて,プログラムが複雑になることを辛抱すれば, リロケータブルなプログラムを書くことは不可能ではありません. しかし,Z80の命令をフルに使用できませんし,スピードも低 下するので,この方法では大きなプログラムを作ることはできま せん. そこで,アドレスの情報とプログラムの本体を分離してやって プログラムを実際に実行(ロード)するときにアドレスを書きこ んでやろうという考えが出てきます.たとえば, LD A,(SEA) LD A,B LD A,(SKY) ADD A,B LD (SHIP),A JP NEXT SEA: DEFB 12H コノ SKY: DEFB 34H ラベルメイ SHIP: DEFS 1 ミオボエ NEXT: ... (次のステップへ) アルカナ? というプログラムがあったとします.ORG 命令がないので,この ままではどのアドレスへロードされるかわかりません.とりあえ ず先頭を 0000H 番地と見なしてアセンブルします. :0000=3A 0E 00 \ :0003=78 | :0004=3A 0F 00 | これが :0007=80 | :0008=32 10 00 | オブジェクト :000B=C3 11 00 | :000E=12 34 00 | :0011=... / それだけでなく,ついでに「ラベルを参照しているアドレス」 の表(テーブル)を作ります.上のプログラムの場合, SEA 番地を参照しているアドレス : 0002H SKY 〃 : 0005H SHIP 〃 : 0009H NEXT 〃 : 000CH となります(ただし,EQU 命令で定義されているアドレスは,こ の限りではありません).これを,先ほどのオブジェクトと一緒 にセーブしておきます.こうしてできたものが「リロケータブル ファイル」です. そしてプログラムを実行するときには,このテーブルを参照し て,例えば先頭アドレスを 8000H とすれば,オブジェクトを 8000H 番地に読み込んでおいて,メモリの 8000H 8002H,8005H, 8009H,800CH の内容にそれぞれ 8000H を足せばよいのです(現 実には,アドレスの上位バイトまたは下位バイトのみを参照して いる場合もあるので注意).この作業をするプログラムを「ロー ダ」といいます.こうして実際に実行できるオブジェクトができ あがります. ZEDAやREDAには,このようなリロケータブルファイル を作成する機能はなく,アセンブルするときにオブジェクトの先 頭アドレスを決めなければなりません(アブソリュートアセンブ ラという).そこで,ZEDAまたはREDAで2種類のアドレ スのオブジェクトを作っておき(当然内部参照しているアドレス だけ異なるオブジェクトができる),異なる部分だけ取り出して アドレステーブルをこしらえるということを考えました.それが Oh!MZ87年11月号に発表された「アロケータ」です.こ の方法で,それまで発表された多くのアプリケーションをリロケ ータブルにすることができます.しかしこれでは単に先頭アドレ スを変えて再アセンブルするのと大差ありません(アセンブラよ りローダのほうが小さいし,ソースをメモリ上に置かなくても良 いというメリットはあるが). オブジェクトをリロケータブルにするのは,ただプログラムを 任意のアドレスで実行可能にするだけではなく,もう一つ大きな 目的があります.それは「分割アセンブルを可能にすること」で あります. 複数の人間でプログラムを開発する場合,各サブルーチンの先 頭アドレスは決まっていませんし,実際にすべてのサブルーチン を繋げて見なければ分かりません.増してや高級言語(Cなど) を使う場合はなおさらです. サブルーチンをリロケータブルファイルの形で別々に開発して おいて,最後に1本のプログラムにまとめることを「リンク」と いい,そのためのプログラムは「リンカ」または「リンケージエ ディタ」と呼ばれます. 前述の「アロケータ」と「ローダ」の組み合わせでは,このよ うなスタイルの開発はできません.なぜなら,1本のサブルーチ ン毎にアドレスを入力してやる必要があり,操作がとても複雑に なるからです. まさにWZDやWLKは,「分割アセンブル」や「高級言語」 に対応したプログラムと言えましょう.元々,WZDは Small-C をS−OSに移植するために作られたアセンブラだからです. (EOF)