−90−
パソコン上でのファイル変換
吉村 卓
FileConversionfromB16‑BASICto N88‑BASIConPC‑9801
TakashiYosHIMuRA
(平成元年10月31日受理)
また,B16‑BASICもN88‑BASICもともに,Mic rosoft社系であるが,非アスキー形式のファイルは 機種により,その中間言語の命令コードが異なるの で,変換作業を容易にするために,アスキー形式で セーブされたBASICプログラムファイルの転送を扱
うことにする。
なお,N88‑BASICにはディスク内のセクタを直接 読み書きできるDSKI$関数とDSKO$という便利な コマンドが用意されているが, これらの命令は1セ クタ256バイトのディスクフォーマットでないと使用 できないので,B16‑BASICからN88‑BASICへの ファイル転送のためには,ディスクドライブ機械語 ルーチンを用意する必要がある。
ところで,B16の5インチ2HDからN88‑BASIC へファイルメディア変換されたBASICファイルは
FII」RSコマンドでファイル名を表示することがで きる。 しかし, ファイル名の表示が正常になされた としても,必ずしもそのままテキストファイルとし て利用できるとは限らない。単にメディア変換され ただけのファイルをloadしようとしてもDirect statementinfileという応答が返ってきて,正常に ファイルを読み込むことができない。それは,B16‑
BASICプログラムの行の先頭に記録されている数 バイトの文字列のためにPC‑9801では正常に読めな いのである。それ故, メディア変換されたファイル の内容の変更が必要となる。
1. 目 的
昭和48年度に導入されたHITAC‑8250は15年間の
永きにわたって本校の情報処理教育に貢献してきた が, この度ようやくその任を終え,平成2年3月を 期して新システムに更新されることになった。機種 選定の作業も一段落し, 日本データゼネラル社製の ECLIPSEMV/2500DC2台から成るシステムが導入されることとなった。
このシステムには,RS‑232C接続により,あるい はEthernetLANを介しNEC製のPC‑9801シリー ズ等が接続可能であるが,現在,本校計算機室に設 置されている日立製のB16は接続できない。それ故 B16で開発されたソフトはそのままでは利用できな いこととなる。そこで,B16‑BASICのプログラムを N88‑BASICのプログラムに変換しようというのが 本稿のめざすところである。
2. 変換方法の概要
B16とPC‑9801がRS‑232Cケーブルで接続でき る距離のところにあれば,アスキーセイブされたB16
‑BASISCファイルをN88‑BASICに通信利用のフ ァイル転送する方法が最も簡単であるが, この2機 種がいつでも併置されているとは限らないので, こ こでは, この方法は採らないことにする。
ところで,B16‑BASICはMS‑DOSの管理下で動 作し,データ転送はMD2HDで1セクタ1024バイ ト単位で行なわれる。一方,PC‑9801に標準装備の N88‑BASICはスタンドアローン・タイプで, ファ イル転送は1セクタ256バイト単位でなされる。そ れ故,PC‑9801でB16のディスケットを直接読むこ とはできない。そのため,MS‑DOSファイルをN88
‑BASICファイルに転送するプログラムを用意しな ければならない。
3. 変換の道具とプログラミング手法
3. 1 ディスク・ダンプとディスク・エディタ
図1はB16‑BASICの,図2はN88‑BASICの同 じ内容のプログラムのダンプ・ リストの先頭部分である。いずれもアスキー形式でセーブしたものであ
る。B16‑BASIC,N88‑BASICいずれもマイクロソ フト系のBASICなので,アスキーセーブしたファ秋田高専研究紀要第25号
−91−
パソコン上でのファイル変換
<<DISKEDITOR>>
PAGE: 1
DRIUE: 2TRACK:54(36H) SURFQCE: 0SECTOR: 8(08H) 0 1 2 3 4 5 6 7 89R B C D E F
0
1
2 34 5
67 8 9 A B C D E F
8123456789ABCDEF
0Q31392027202A2R2R2Q2Q204D415452 495826494E56455253494F4E202A2R2A
2A2QODO自舶3230202722444154412049 4E5255549DORBA333020494E50555420 224E3D22384EGDOA9A34392044494D22
41284E2C4E292C58284E2C4E290DBAGA
353020464F5220493D3126544F204E8D 0QQR363026464F52204A3D3128544F20 4EGDBABA3730205652494E5420224128 22384938222C22384Q3822293D223BGD OA0Q383926494E505554204128492C4Q 290DBRBR3930204E455854204QQD9自舶31 3230225828492C49293D310DBABA31
3130204E45585420490DBAOQ31323028 5052494E540DGAGA31 3330205052494E54202241 3D220DBAOA31343920585249
図1 B16‑BASICのダンプ・リスト
A94E490F8D90E42B12444422420234523
30 31 58 2A 55 22 4E 52 4F 50 3B 55 58 3D 31 52 52
Surface 302027 2049 4E ODOA32 540DOA 3B4EOD 29 2C58 20493,
52 204A 52 49 4E 4A3B22 54 2041 54 204A 31 0DOA 32 3020 49 4E54 49 4E54
0 20 56 30 33 0A 28 31 3,
54 29 28 0,
31 50 20 20
Sector 2A2A2A 45 52 53 202720 302049 343020 4E2C4E 20544F 31 2054 2022 41 3D22 3B 49 2C4A OA31 30 31 3020 52 49 4E 22 41 3D 22 9822 Track
OOOO OO10 0020 0030 0040 0050 0060 0070 0080 0090 o0AO OOBO OOCO OODO OOEO OOFO
10 ' *****MATRI
X INVERSION****
* 20 ' DATA INP UT 30 1NPUT ''N=
0';N 40DIMA(N, N),X(N,N) 50FO R I=1TON 60F ORJ=1 TON 70 PRINT ''A('' ;I; '0 , ''
;J; '')='' ; 80 1NP UTA(I ,J) 90NE XTJ 100X(I, I)
=1 110NEXT I 120PRINT 130P RINT ''A=0' 140P RINT ''r'' ;SPC(12*
20 4E 54 55 4D OA OD 4E 3B 38 0A 58 58 0A OA 50
4,
20 41 54 20 35 oA OD 49 30 39 28 54 31 31 43
54 2A 49 22 28 20 30 37 22 49 20 2C 49 30 30 31
52 2A 4E 4E 4E 46 20 30 2C 4E 4E 49 0,
20 20 32
9AODCF602059AOOA4253244225420552
2A 4F 41 50 49 OD 4E 20 22 OA OD 20 45 0D OD 53
1AOO106A・BOO903484222433032342332
図2 N88−BASICのダンプリスト
は正常に読み込むことができなかったのである。 し たがって, このコードを消去すれば,PC‑9801の標 準形式のテキストとして正常に読み込むことが可能
となる。
このようにファイルの内容を観察する目的のため にディスクダンプ・プログラムが必要となる。
ところで,B16‑BASICプログラムの各行の先頭に あるOAhを消去すると当然ファイルの長さが変って 以後の取り扱いが面倒になる。OAhを20h(空白)
イルの格納状態は殆んど同じである。B16‑BASICの アスキー・ファイルでは,プログラム行の区切り符 号として,各行の先頭にOAhなるコードがつけられ ているが,N88‑BASICファイルにはこのコードはつ いていない。また各行の終りにはB16‑BASIC,N88
‑BASIC両者ともにODh,0Ahなるコードが, さら に, ファイルの終りには共にlAhなるコードがつけ られている。B16‑BASICの各行の先頭にあるコード OAhのために,B16‑BASICファイルをPC‑9801で
平成2年2月
−92−
吉村 卓
ファイル名の1バイト目がE5hの場合は削除され たファイルであることを表わし, またここが00hの 場合は未使用のディレクトリ ・エントリであること を意味し, これ以降にはディレクトリ ・エントリは
ない。
ところで, ファイル領域はクラスタ単位で管理さ れる。ディレクトリ ・エントリは最初のクラスタ番 号のみを指し示す。 2番目以降のクラスタ番号は,
FAT(ファイルァロケーションテーブル)の中に書 かれている。すなわち,大きさが1クラスタ以内の ファイルは,ディレクトリ・エントリの27バイト目 のクラスタ番号によりそのファイルのディスク上の 位置を知ることができるが,複数のクラスタから構 成されているファイルの場合,最初のクラスタはデ ィレクトリ ・エントリのクラスタから知ることがで きても, 2番目以降のクラスタはFATをみなければ,
それがディスク上のどこに存在するかを知ることは
できない。
FAT内の各エントリは1.5バイト (12ビット)ず つが各々のクラスタに対応して,後に続くクラスタ の番号を指し示している。そして,FFFhが現われ たところでそのファイルは終りである。すなわち,
FATの内部は3バイトの領域を1.5バイトずつに分 解してこれを1エントリとして管理しているので,
後続クラスタ番号を読み取るには次のようにする。
(1) 3バイトのデータを後ろから1バイトずつ逆
に並べる。
(2) 1.5バイトずつに分ける。
(3) 最初の1.5バイトと2番目の1.5バイトを入 れ替える。
また,求めるエントリがFATの何バイト目から 記録されているかを調べるには次式による。
開始番地(FAT内のオフセット番地)=(エントリ番
号¥2)×3
実際のファイル転送の作業手順は次のようにする。
(1) 原フロッピーディスク (MS‑DOS)から転送 されるファイルのクラスタ番号を得る。
(2) そのクラスタのセクタ番号を計算する。
(3)上の計算に基ずいて,原フロッピディスクか
ら1セクタ(1024バイト)をMS‑DOS用のバッフ
7(#O〜3に割り当てる)に読み出す。(4) 256バイトずつN88‑BASIC用のバッファ
(#4に割り当てる)を経由して目的フロッピーディ スクに書き込む。
(5) ファイルの終りまで上記(1)〜(4)を繰り返す。
上の(2)のクラスタ番号からセクタ番号等を算出す で置き換えるのが簡単である。短かいプログラムな
らば人手でこの置き換え操作を行なうことによって
B16プログラムをN88‑BASICのプログラムとして
利用できることになる。この目的のためにはディスクエディタ・プログラ ムを用意する必要がある。
ディスクダンプ,ディスクエディタいずれにして も,CRT上あるいはプリンタに出力すべきファイル
をB16‑BASIC用にフォーマットされたディスケッ
トから読み込んでこなければならないが,先述した ようにB16‑BASICはMS‑DOSの管理下にあり,
ディスクとの読み書きは1セクタ1024バイト単位で 行なわれるので,N88‑BASICで利用可能なDSKI$
は使用できない。したがって,少なくともディスケ ットからの読み込みルーチンは機械語でプログラミ ングしなければならない。その際DISKBIOSを利 用する。すなわち, タイプIBhの内部割込みを利用 することにする。それには,AHレジスタにBIOSの 内部識別コード(データ読み出しの場合56h)を,AL レジスタにPDA(物理デバイスアドレス)を,BXレ ジスタにデータ領域の長さを,CHレジスタにセクタ 長(1024バイトの場合03)を,CLレジスタにシリン ダ番号を,DHレジスタにヘッド番号を,DLレジスタ にセクタ番号を,ESレジスタにデータ領域のセグメ ントベースを,BPレジスタにデータ領域のオフセッ トアドレスをそれぞれ格納してCALLIBhを行なえ ばよい。
3 . 2 ファイル転送
B16‑BASIC用のディスケットからN88‑BASIC
用のディスケットヘファイル転送するには,MS‑DOSの ディスク・ファイルの管理方法を知る必要がある。MS‑DOSでは,ファイルの名前とそのファイルが 格納されている場所を別々のテーブルで管理してい る。前者のテーブルはディレクトリと呼ばれ,後者 のテーブルはFATと呼ばれる。
ディレクトリには, ファイル名とそのファイルの 格納場所の入り口ち及びファイル属性が記録されて いる。そして, 1つのファイルの情報のまとまりは ディレクトリ・エントリと呼ばれるが, 1つのディ レクトリ ・エントリはディレクトリの中で32バイト からなる。先頭の8バイトにはファイル名が,続く 3バイトには拡張子が入れられる。 12バイト目には ファイル属性が, 27バイト目からの2バイトにはそ のファイルがディスクの中のどこに格納されている かを示すFATのエントリ番号が入り最後の4バイト にはファイルの長さがバイト単位で記録されている。
秋田高専研究紀要第25号
−93−
パソコン上でのファイル変換
このプログラムに,探し出した文字列と置き換え たい文字列とを交換する部分を付け加えれば異機種 間の簡単なBASICファイル変換プログラムとなる。
たとえば,LOCATE文のようにX座標とY座標の 位置が逆になっているような1対1の変換だけだと 容易にファイル内容の変換が可能である。
るには次式による。
T=(C+9)¥16
H=((C+9)¥8)MOD2 S=((C+9)MOD8) +1
ここにC:クラスタ T: トラック H:ヘッド S:セクタである。
なお,MS‑DOSのMD2HDのFAT位置はT=0, H=0, S=2〜3であり,ディレクトリの位置は T=0,H=0, S=6〜8である。
3 .4 漢字コード変換
セクタ単位で一括転送されたファイルに漢字コー トが含まれている場合,転送後のファイル内の漢字 コードを変換する必要が生ずる。
N88‑BASICでは1バイトコードにはASCIIを,
2バイトの漢字コードにはJIS漢字ロードを使ってい る。この組み合わせではコードが重なる(21h〜7Eh) ので切換えコードが必要である。
すなわち,漢字文字列の最初には漢字イン(KI) が,最後には漢字アウト(KO)が付けられる。これ
らのコードには1B4Bh(ESCKと呼ばれる)と1B48h (ESCHと呼ばれる)が用いられる。
一方,B16‑BASICでは1バイトコードはASCIIを 使っているが, 2バイトの漢字コードにはシフト JISコードを使っている。この組み合わせの場合は 切換えコードを必要としない。というのは,アスキ ーコードは80hから9FhとEOhからFFhが未定義 となっているので, この領域を漢字コードに用いる ことにすれば,漢字開始や終了を指示しなくてもこ れらのコードが現われたときそれが漢字であること が分るからである。
ところで,JISコードとシフトJISコードでは切 換えコードの存在によって漢字コードが含まれるフ ァイルの大きさが異なってくることに注意しなけれ ばならない。アスキー形式でセーブされたファイル はシーケンシャルファイルとして行単位で読み書きで きるので, 1行ごとに変換すればよい。B16‑BASIC からN88‑BASICに変換するには,コード80h〜9Fh EOh〜FFhが現われたら1B4Bhを前置してJISコー ドに変換し,上記以外のコードが現われたら1B48h
を後置する。
3.3 テキスト検索。置き替え
B16‑BASICとN88‑BASICとではコマンドや文 に次のような違いがある。
まず,B16‑BASICはMS‑DOSの管理下にあるの でDOSのコマンドとして CHDIR, MKDIR, RMDIR,ENVIRON,SHELL,SYSTEMなどがあ るが,独立BASICであるN88‑BASICでは当然こ れらは使えない。
また,B16‑BASICのERDEV$,KTN$,SCREEN などはN88‑BASICの文に該当するものがない。
しかし,以下に示すように,容易にN88‑BASIC の文で置き替え可能なものもある。括弧内はN88‑
BASIC文である。 LCOPY(COPY),PALETTE
(COLOR), RESET(CLOSE),VIEWPRINT (CONSOLE),PMAP(MAP),CDBL$(AKCNV CSNG$(KACNV$),INPUT¥(KINPUT),KPOS (KINSTR),GET(GET@),PUT(PUT@)など。
また,B16‑BASICとN88‑BASICとではパラメー タの書き方に少しだけ違いのあるものもある。
CLS,COLOR,LOCATEなど。
さらに,KEYON,KEYOFFはB16とN88とで
は意味が異なるが, B16‑BASICでの意味はN88‑BASICではCONSOLE文で表わすことができる。
ファイル転送後,機種によるBASIC言語の僅かな 違いを目的のBASICに適合するよう,ファイルの内 容を変換するためのユーティリティが必要である。
テキスト検索プログラムはASCIIセーブされたプロ
グラムの中に指定された任意の文字列がどこに含ま
れているかをCRTやプリンタに表示する。すなわち,BASICプログラムの中に使用されているコマンドや
変数名などがどの行で使用されているのかを表示する。
そのためには,BASICプログラムをシーケンシャ ルファイルとして1行ずつ読み込み,その中の変数 名と行番号をテーブルに記憶しておき, ソーティン
グを行ない,重なりのないように順に表示すればよ
い。
参考文献
押野崇芳MS‑DOS構造解析 ナツメ社1985年
竹迫一雄,二之宮弘パソコンファイル変換法
森北出版 1985年1
2