$$$$$$$$$$$$$$$$$$$$$$$$ S − O S な ん で も 相 談 室 $$$$$$$$$$$$$$$$$$$$$$$$ ◎今回のS−OS通信は1DDにしていただき本当に助かります(前回はMZ250 0用の2DDのため友人にあげてしまいました)。またNETでMAILもいただき まして・・・。  漢字ROMもあり、ドライブも2基あります。しかしSMC−SWORDは漢字表 示はできませんし、発表されているTURBO−SWORDも動きません。ディスク のAUTOEXEC.BATで呼んでいるKPRINT2、VSHELL2も持って おりません。NETに登録されていましたでしょうか?  最近SMC−SWORDのとんでもないBUGに気付きました。SMC−SWOR DはS−OS←→CP/Mのファイル変換がもともとできるようになっているのです。 ところがCP/Mの通信ソフトでS−OS NETから落としたソースなどをZ−M ATEで読み込んでも正しくアセンブルしてくれないのです。どうやらアスキーファ イルの変換がおかしいのでしょう。画面表示は正常なのですが。  SMCユーザーは少数です。その中でもS−OSユーザーは少数で誰もたよれない のが苦しいところです。何か助言ありましたらよろしくお願いいたします。                        #121 東京都 新堂 洋二  回答その1.「S−OS通信」は、マイナー機種のユーザーでも お読みいただけるよう、全機種共通日本語表示システム「JACKWRITE2」 を採用しています(漢字ROM不要、ドライブ2基要)。今回新堂さ ん宛へ発送している「KSTディスク」がそれです。また、各機種別 の漢字表示にも対応すべく鋭意努力しておりますので、SMCの漢字 ROMアクセスの資料等ありましたら、事務局まで送っていただけれ ば幸いです。(ついでにSMC版S−OSのシステムも) 回答その2.SMCのCP/Mコンバータの内容は見ていませんが 考えられる原因は、つぎの3つのどれかでしょう。 1)ディレクトリにファイルサイズが書込まれていない。 2)ファイルのアトリビュートが正しくない。 3)ファイルのエンドコード(00H)が正しくない。 TYPEコマンドでちゃんと表示されるならば、怪しいのは(1)と (3)です。 SWORDではディレクトリが 010H〜01FH に32バイト単位で格 納されており、各ディレクトリの先頭から1バイト目がアトリビュー ト(01H→Bin,04H→Asc)18,19バイト目がファイルサイズ、31 バイト目が先頭クラスタ番号です。 また各ファイルの内容は、 00Hレコードから16レコード(=1ト ラック)ずつ、クラスタという単位で管理されていて、ファイルがど のクラスタを使用中かを示すテーブル(FAT)は、00EHレコードに あります。クラスタ番号は01H〜7FHで、00Hが未使用、80H〜8FHは最終 クラスタを示し、(下位4ビット)+1がそのクラスタ内での使用レ コード数となっています。したがって、ディレクトリ上の先頭クラス タを見て、FATをたぐっていけば、そのファイルのサイズが求めら れます。 DREAMなどのディスクモニタを使って調べてみましょう。 ◎BBSの方はどうなっているんですか?最近、というよりパソコンを買って(X6 8K)モデムを買うまでどこにもアクセスしてなかったので全然わからなかったので す。BBS電話帳の‘91春号に名前がなかったような・・・。                        #152 岡山県 平井 哲也  すみません!春号に掲載されなかったのは、ただ単に、DEMPA にアンケートを送り返すのが間に合わなかっただけです。そのアンケ ートが、到着が遅いうえにすぐ締切りになってしまうものだから。で も、秋号にはしっかり載っていますのでよろしく(P385)。 ◎ミュージックドライバの開発も一段落した11月の土曜の午後、裏庭のダンジョン でハエ男をフライにして食べていた頃。 今度は「Sサイズベーシック」を作ろうと 思ったんです。 が、いきなり変数の内容管理で詰まりました。  例えば文字変数など常駐文字列の長さが変わるような場合。 仮にベーシックで A$=″0123456789″ という変数が A$=″012″ と再定義されると、今まであった″3456789″はどうなってしまうのでしょう か?  1)すでに要らないと分かった以上、前後の内容を転送して埋めてしまう。 >うーん、とんでもなく重そう。 2)ひたすらほっとく。 >メモリを湯水の如く使うだろうな。 というわけで、今の私の頭ではこの2つぐらいしか思いつきません。一般的なベーシ ックではどう管理しているのでしょうか? # 98 静岡県 松下 篤根  大雑把に言えば、HuBASICなどのシャーブ系のBASICで は(1)の方法を、N88−BASICなどのMS系BASICでは (2)の方法をとっています(FM系を除く)。 まず、N88BASIC等の管理方法ですが、大体つぎのようなア ルゴリズムで管理しています。 (a)文字列格納エリアのアドレスは静的で、領域のバイト数はCL EAR文によって定義されます。 (b)文字変数が定義(初めて代入)されたときは、シンボルテーブ ル(通常変数エリア)にストリング・ディスクリプタと呼ばれる 一種のポインタが生成され、文字列格納エリアの未使用域に実際 の文字列が入ります。 (c)文字変数の内容が更新された場合、代入された文字列は文字列 格納エリアの未使用域(使用域の末尾の次)に追加され、ストリ ング・ディスクリプタは新しいアドレスへ更新となります。した がって、以前の文字変数の内容は、ゴミとなってメモリ上に残り ます。 (d)これではすぐ文字列格納エリアがパンクしてしまうので、未使 用域がなくなった時点で、ストリング・ディスクリプタが指して いる文字列だけを、メモリの下位へ詰めてしまいます(ガベージ コレクションという)。  これがHuBASIC等では、次のようになります。 (a)文字列格納エリアは、通常変数エリアの直後に動的に取られる。 文字列格納エリアの先頭アドレスは、システム変数STRPTR によって知ることができます。 (b)文字変数の内容を指すポインタが通常変数エリアに生成される のはN88と同じですが、その値は(STRPTRの値)からの 相対アドレスです。 (c)文字列が更新されたときは、文字数が以前と同じ場合はそのま まのアドレスで文字列の入れ替えを行ない、違う場合はもとの文 字列長分データを詰めて、新しい文字列は文字列格納エリアの未 使用域に追加されます。 例えば 10 A$=″ABC″ 20 B$=″123″ 30 A$=″@@″ というプログラムがあったとします。N88等では、実行後のメモリ の状態は XXXX 41 42 43 31 32 33 40 40 00 ... ↑ ↑ ↑ ↑ ストリング ゴミ B$の A$の 領域の先頭 内容 内容 となりますが、HuBASIC等では XXXX 31 32 33 40 40 00 ... ↑ ↑ ↑ STRPTRの B$の A$の 値+α 内容 内容 のようになるわけです(実際にはもう少し複雑な管理をしているよう です)。 昔PC−8801や初期の9801で、メモリを節約するため数値 を1バイトで表現して、文字コードに置き換えるプログラムを作った ことがありました。HuBASICではそういうことは起こりません が、RUNすると、最初調子良く動いていたものが、突然数分間も停 止してSTOPキーすらきかなくなるんですね。初めは原因がわかり ませんでしたが、ストリングエリアを大きく取り過ぎて、CPUがガ ベージコレクションに忙殺されていたんです(それは、プログラムの 要所に A=FRE(0) などと入れることにより解決しました)。 ああ、なつかしの時代。 ◎Small−Cでのコンパイルの方法がわかりません。プログラムの実行まで具体 的に教えてください。 浜松市 松下氏他多数 Oh!Xの記事は、CP/Mからの移植者を対象にしていますので、 CP/M版のSMALL−Cを持っていない人にはわかりにくい内容 になっています。また弊会より配付いたしましたディスク(Oh!X より限定配付されたものをそのまま回しただけですが)と,Oh!X の記事が一致しないため、かなり戸惑われた方がいらっしゃったよう です。ここでは簡単に、SMALL−Cで作成したプログラムのコン パイル/リンクの方法を説明します。 次のようなソースファイル(HELLO.C)をコンパイルしてみます。 #include stdio.h main() { printf("hello.\n") } ただし、SC,WZD,WLK,clib.LIB,stdio.h,HELLO.C の各ファイルがデ フォルトドライブに入っているものとします。 (1)コンパイル # SC: HELLO -M -A -P -O 各オプションの意味については、本ディスクの SMALLC.DOC をお 読みください。 (2)アセンブル # WZD: =HELLO ↑ ソースファイル名 (3)リンク # WLK: /P:3000,HELLO,clib.LIB/S,HELLO/N:P ↑ ↑ ↑ | | オブジェクトファイル名 | ライブラリ名 リロケータブルファイル名 (4)実行 # HELLO.OBJ 画面に hello. が表示されます。 特に、石上氏の一連のコマンドは、コロンの次のスペースが省略で  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ きません。CP/Mから移植したときの名残と思われますが、注意し  ̄ ̄ ̄ ̄ てください。 ◎2500版「S−OS通信」で、プリンタの使用ができません。プリンタの登録方 法を教えてください。  2500版″SWORD″のプリンタ選択方法ですが、BASIC のシステムディスクの18Hレコードにプリンタ情報が書き込まれて いるので、これを″SWORD″の08Hレコードへコピーするだけ でよいのです。なお,BASICと、″SWORD″ディスクでは、 ディスクの表裏が反転していますので、これらのレコードは、物理的 には全く同じレコードです。  簡単なプログラム(MZ-2500用)を以下に示しておきます。これは、 プリンタ登録済みのBASICのシステムディスクから、プリンタ情 報をコピーするものです。ご活用ください。(森) ; ; プリンタ登録ユーティリティ (C)K.Mori ; (WZD でアセンブル) ; _DRDSB EQU 2000H _DWRSB EQU 2003H _VER EQU 1FF7H _MPRNT EQU 1FE2H _FLGET EQU 2021H _DSK EQU 1F5DH _DTBUF EQU 1F64H CSEG CALL _VER LD A,H CP 12H ; 2500? JR Z,L1 CALL _MPRNT DEFB 'Use only MZ-2500.',13,0 OR A RET L1: CALL _MPRNT DEFB 'プリンタ^登録^された' DEFB 'BASICのシステム' DEFB 'ディスクをドライブB' DEFB 'にセットしてください.',13 DEFB 'SWORDのシステム' DEFB 'ディスクをドライブA' DEFB 'にセットしてください.',13 DEFB '準備ができたらどれかの' DEFB 'キーを押してください.',13,0 CALL _FLGET CP 27 JR NZ,L2 RET L2: CALL _MPRNT DEFB '作業中...',13,0 LD A,'B' LD (_DSK),A LD DE,8 LD HL,(_DTBUF) LD A,1 CALL _DRDSB RET C LD A,'A' LD (_DSK),A LD A,1 CALL _DWRSB RET C CALL _MPRNT DEFB '終了しました.',13 DEFB 'プリンタ^を使用する前に' DEFB 'リセットしてください.',13,0 OR A RET END (EOF)