パソコン活用研究ラピュタへの道(アセンブラ、DOS、Windows、旧型PCの活用研究)

RS232Cプロジェクト
 
1  はじめに(RS232Cプロジェクト)
  最近、WINDOWSで使えるF-Basic、N88Basicなどが市販されているようですが、
もし、昔のふるーい8ビット機(FM-7/8、PC-88)なんかが、まだ
あったりして(そんな人はごくまれだと思いますが)、それらの8ビット機上
のBasic プログラム なんかをWINDOWS機に移植したいと思ったら、どうしたら
良いでしょうか。おそらく、RS232Cでデータを転送するしかないと思います。 
  かくいう筆者も、FM-8(OSはF-Basicスタンドアロン、CP/M)、PC-2001(N20Basic
スタンドアロン)、PC-98(OSはN88Basicスタンドアロン,MS-DOS)、DOS/V(Win95)
などを所有しており、各機種間でソースファイルやデータファイルの交換の
必要性にせまられました。そこで、各機種間全てでデータおよびプログラムの
相互転送、共有化をはかるのを目的としてRS232Cプロジェクトをスタートしました。
ふるーいパソコンをお持ちの皆さん、RS232Cで活用してあげましょう。  
当原稿は、シリアルデータ通信について概略を説明しました。
2 移植に立ちはだかる互換性の壁
  ここ10数年で、急速に進歩してきたパソコンで、常に悩まされたのはパソコン間の
互換性の問題ではないでしょうか。新しい機種を買うごとに、他メーカーのものに乗り換える
ごとに、それまでの資産(データファイル、ソースファイル他)が継承できるかどうか
が、いつも問題としてつきまといました。CPU,ハードアーキテクチャ、OSが違えば
まず互換性はないといっても良いでしょう。互換性の壁を乗り越えるべく、いろんな
コンバート用のプログラムが編み出され、また最近は、ある点ではフォーマットの共通化
が進んできています。しかし、最近でも同じ8086系CPU,同じOS(MS-DOS)
を使用しながらPC-98とDOS/V(PC/AT互換機)で2HDのフロッピーディスク(以下FDと略す)は
フォーマットの違いで、データファイルすらやりとりできず、大昔でいえば、同じCPU(Z80)
同じOS(CP/M)を使用しながら、各メーカのCP/M機間で互換性がなかったものです。
  筆者のパソコンでいえば、プログラムの保存メディアは、FM-8は5”2DDのFD
(今はもう販売してない)、PC-2001はテープのみ、PC-98は3.5”FDだが、
1.2Mフォーマット。DOS/Vは3.5”の1.44Mフォーマットという具合なので、
相互にデータ交換しようとしても、まったく不可能なのです。これらの機種で残された手段
というと、RS232Cしかないと言って良いでしょう。
3  RS232Cとは
(1)  シリアルデータ転送
  RS232Cはシリアルデータ転送(直列データ転送)の1つの規格で、アメリカ電子工業
規格できちんと定められた規格です。各パソコンのシリアルデータ転送ポート(以下SPと
略す)は一応みなRS232C規格に準拠して設計されており、各パソコン間で互換性の
非常に高いデバイスです。SPの用途としては、現在ではモデムをつなぐというのが、もっとも
一般的だと思います(2000年以前の話)。
(2)  RS232C規格概要
  RS232Cの規格のうち非常に重要なものとして定められている、信号線の機能について
概要を説明します。
  
  DB 25ピンのシリアルポート(PC9801シリーズ)のピンの配置
  __________________________________
 |  1   2   3   4   5   6   7   8  9  10 11 12 13  |  PC98背面
 |   14 15 16 17 18 19 20 21 22 23 24 25    |
 | _________________________________|
  信号     ピン    機能
  GND    1      アース
  TXD    2      送信データ
  RXD    3      受信データ
  RTS    4      モデムへの送信要求
  CTS    5      モデムからの送信可能信号
  DSR    6      モデムからの動作可能信号
  DCD    8      キャリア検出(モデムが相手方のデータ受信中)
  RXC    17    受信クロック
  DTR    20    ターミナル(パソコン)の動作可能信号
  TXC    24    送信クロック出力 
上記のピン配置はPC9801シリーズのものです。
DB9ピン (DOS/V機等)  背面からみた図
 ______________
|1  2  3  4  5 |
|  6    7    8    9    |
|______________|

信号  ピン
DCD    1
RXD  2
TXD  3
DTR  4
GND  5
DSR  6
RTS  7
CTS  8
RI   9
RS232Cでは、RTS,CTS,DSR,DTRが全てON(モデムもパソコンも
動作可能状態で、データ送信要求がなされた)時、TXDよりデータが送信されます。
(モデムが接続されている場合、パソコンからモデムにデータが転送され、モデムから
相手の機器にデータが送出される。)

FM-8, PC2001のピン配置は「4 各機種間データ交信」に参考までに記述してあります。
 
(3) パソコン同士の結線
  電子メール、インターネットの場合はモデムを介してデータのやりとりをしますが、
パソコンのSP同士をRS232Cケーブルでちょくせつ結線して、データ交換する
場合は上記より簡単な話になります。パソコン同士をつなぐ場合は、通常非同期式の
データ通信なので、RXC,TXC(クロック入出力)は不要です。また、モデムを
使わないのでDCDも関係ありません。
  すなわち、パソコン間のデータ転送では、7ピン(7つの信号)のみ使われます。
他のピンは使われません。7つの回線(信号)の機能は、TXD(送信)、RXD(受信)、
RTS(送信要求)、CTS(送信可)、DSR(データセットレディ)、GND(接地)、
DTR(データ末端レディ)です。
  昔のBASICではRS232Cをオープンすると(OPEN文)、RTS(送信要求)、
DTR(データ末端レディ)がONになります。従って、下記のように結線すれば、
RTS,CTS,DSR,DTRの全てがONとなりデータの送信ができるように
なります。
(その1)                      (その2)
GND−−−−GND             GND−−−−GND
TXD−−−−RXD             TXD−−−−RXD
RXD−−−−TXD             RXD−−−−TXD
RTS−−−−CTS             RTS−    −RTS
CTS−−−−RTS                   |    |         自己結線
DSR−−−−DTR             CTS−    −CTS
DTR−−−−DSR             DSR−    −DSR
                                      |    |          自己結線
                                 DTR−    −DTR  
TXD,RXDは必ずクロスして結線します。(送信側のデータ送信と受信側のデータ受信
を結ぶ。当たり前ですが)
その1の結線では、RTSとCTS、DTRとDSRをクロスさせ、それぞれのRTS,DTR
のONが相手のCTS,DSRをONするようにします。
その2では、自分のRTSとCTS,DTRとDSRを自己結線し、自己のRTS,CTSのON
が自己のCTS,DSRをONするようにします。ただし、この場合は相手のパソコンの状況
にかかわらず、データ送信可能となるので、あいてのパソコンの準備ができていなければ、
データは無駄な垂れ流しとなってしまいます。
  さて、以上はパソコン間の結線でも比較的厳密な場合で、古いパソコンのBASICの場合
もっとルーズなケースが多いようです。古いBASICでは、DTRとDSRもまったく
チェックしてないケースがほとんどです。従って、DTR,DSRを無視して、5本の信号線
だけで、送受信可となります。
  更には、GND−−−GND,TXD−−−RXD,RXD−−−TXDの3本だけでO.K.
という場合も結構あります。
  結局、25ピンのうち3ピンだけで用がたりてしまうわけです。RS232Cは
各電子機器間のデータ送受信、あるいはパソコンから周辺機器の制御をするため
に定められた工業規格で、結講きちんとした規格です。しかし、古いBASICではその
ごく1部の機能しか使用しておらず、細かいことは無視しています。
(4) 通信プロトコル
  パソコン同士をつなぐ場合であっても、お互いに通信条件について一致させておかないと、
データのやりとりができません。設定すべき条件として一般的には以下のものがあります。
@ ボーレート(データ転送スピード)
   データ転送のスピードです。1秒間に転送するビット数をあらわします。
   BASICでは、300、600、1200、2400、4800、9600ボー
   の中から選択することが多いと思います。
A ビット長
   データの1文字をあらわすのに、7ビットで表すか、8ビットで表すかの選択です。
B ストップビット
   データの区切りとして、データの最後につけるのがストップビットです。これを、1ビット
   にするか2ビットにするか選択します。
C パリティチェック
   送られてきた1文字分のデータに誤りがないか、確認するために付加するビットです。
   偶パリ、奇パリ、パリティ無しから選択します。
D Xパラメータ 
   データが受信能力を超えて送られてくると、受信バッファからデータがあふれて、データ
   の取りこぼしをしてしまいます。この時、送信側に一時的にデータ送信の停止を要求する
   ことができます。この機能のON(XON)、OFF(XOFF)をきめます。
   受信側で受け取ったデータをプリンターに出力するなど、時間のかかる処理をする時には
   XONにします。ただし、昔のBASICシステムでは、送信側が停止の合図を受け取っても、
   自動的には、送信停止にならないことが多いようです。BASICプログラムで停止の合図を
   うけたら、一時停止になるよう、プログラムする必要があります。
E Sパラメータ
   データビット長で7ビットを選択すると、(JISコード)カナ文字が送信できません。  
   SパラメータをONにすると、SOコード(以下のデータをカナとして扱う)、SIコード
   (以下のデータを英数文字として扱う)の送信がなされ、カナの送信も可能になります。
これ以外にも、各機種固有の設定(キャリッジリターンの取り扱いなど)がありますが、
ここでは割愛します。
4  各機種間のデータ交信
(1) コネクタ、ケーブル
  筆者所有のパソコンのSPコネクタの形状についてのべます。
シリアル転送用コネクタは一般的には、PC-98系は25ピン(ノート型はハーフ14ピン
もある。最近の機種はDOS/Vと同じく9ピンになっている)DOS/Vは9ピンです。
以上のものについては、市販のクロスケーブルが販売されてますので、接続は簡単です。
古いパソコンはコネクタが標準外のものが多く、PC2001は丸型8ピン、FM-8は特殊
な26ピン(なんせ古いマシンなもので、コネクタの形状が最近の標準品と違う)で、
市販のケーブルはもちろんありません。
  従って、古い機種の場合はコンタクトピンにコードをはんだづけして、ケーブルを自作する
しかありません。しかし、上述したように、実際に使う信号線は多くて5本なので、小さい
ワニグチクリップでピンをはさんで結線させてもできます。
  ちなみに、PC2001は信号線もまったく独自の仕様でTXD,RXD,GND,RTS,
CTSに+5V,+12Vという変な信号になっています。
 FM8のRS232C               FM−8
 ワニ口クリップではさんで結線。 これでO.K.
FM−8のピン配置(背面からみた図)

25 23 21 19 17 15 13 ・・略・ 1
26 24 22 20 18 16 14          2

信号   ピン
GND  14
CTS    18   *CTSとRTSは自己結線すればよい
RTS  20
RXD  22 (受信データ)
TXD  24 (送信データ)


おまけにPC−2001のピン配置(丸型8ピン)(背面から)

  8  7  6
  5  4  3
   2   1
信号    ピン
GND   1
GND  2
RXD  3
+12V 4
TXD   5
RTS  6
+5V   7
CTS  8

 
(2) RS232Cインタフェースの使用によるデータ転送
@  もっとも単純なデータ送信
  特にどうといこともありませんが、各機種で"A"をRS232Cで送信する実験用BASIC
プログラムです。全てはこのプログラムからはじまると思います。(通信プロトコルはいずれも
データビット長8ビット、ストプビット1ビット、パリティなし、X,SパラメータOFF
転送レート1200ボー)
一般にBASICでは、open文で通信条件を設定し、print文でデータを送出します。
各BASICでそれぞれの記述の仕方は若干異なります。
PC98  N88Basic
10 CLS
20 OPEN"COM1:N81NN"AS #1   'PC98では別のユーティリティで転送スピード設定
30 PRINT #1, "A"           'N81NN ノンパリ、8ビット長、ストップビット1、X/SパラOFF 
40 CLOSE #1
PC2001  N20Basic
10 TERM J,0,4           '8ビット長、ノンパリ、1200ボー
20 PRINT %1, "A"
FM-8  F-Basic
10 OPEN "O", #1, "COM0:S8N1"    'FM-8ではディプスイッチで転送スピードを設定
20 PRINT #1, "A"         'S8N1 SLOWモード、8ビット長、ノンパリ、ストップビット1
30 CLOSE
DOS/V  Visual Basic 4.0
以下のプログラムは主要な部分の抜粋です。VBではこれだけでは完全なプログラムに
なっておりません。Visual Basicは旧来のBASICとはかなり仕様が異なります。 
Begin MSCommLib.MSComm MSComm1   ’ここはRS232C通信用のMSComm.ocxのプロパティ 
      Left            =   5160
      Top             =   3600
      _ExtentX        =   1005
      _ExtentY        =   1005
      _Version        =   327680
      DTREnable       =   -1  'True
      RThreshold      =   1
   End
Private Sub Command1_Click()
MSCom1.Portopen=true
Baud = "1200"
DB = "8"
st="1"
pari = "N"
MSComm1.Handshaking = 0
MSComm1.Settings = Baud + "," + pari + "," + DB + "," + st
MSComm1.Output = "A"
End Sub
A  FM-8 Basicシステム F-Basicによるデータ送信
FM-8のBasicプログラムをアスキー形式(いわゆるテキストデータ)RS232C
で送信するには、メモリーにプログラムを読み込んだ状態で、以下のコマンドでおこなえば
転送できます。
LIST "COM0:S8N1" 'データ長8ビット、パリティ無し、ストプップビット1
フロッピーディスク上のデータファイル、アスキーセーブのプログラムをRS232Cで
送信するプログラム
10 input "File Name"; Fname$  ’読み込みたいファイル名のしてい
20 open "I" ,#1, Fname$       ’ファイルのオープン
30 open "O", #2, "COM0:S8N1"  ’データ長8ビット、パリティ無し、ストプップビット1
40 If eof(1)=-1 then goto80   ’ファイルが終わりなら80行へ飛ぶ   
50 line input #1, D$
60 print #2, D$
70 goto40
80 close: end
B  FM-8 CP/Mの場合
CP/MでフロッピーディスクのファイルをRS232Cで送信するには、以下のコマンド
で行います。(FILE1.FOR というファイルを転送する場合)
A> STAT PUN:=TTY:
A> PIP PUN:=FILE1.FOR [E]
なお、ボーレート他の設定をするコマンドがCP/Mに見当たりません。FM-8の場合
ボーレートはディップスイッチで設定しますが、他のデータ長などは、F-Basicで
設定した条件がそのまま引き継がれているようです。

FM-7/8のファイルをRS232Cで送信する方法については、FM-7/8復活作戦-エミュレーター使用にもまとめました
ので参照して下さい。
CPC98(Basicシステム、N88Basic)
PC98でメモリー上のBasicプログラムをアスキー形式(いわゆるテキストデータ)RS232C
で送信するには、以下の通りSAVEコンマンドでできます。
データビット長8ビット、ストプビット1ビット、パリティなし、X,SパラメータOFF
SAVE "COM1:N81NN",A
フロッピーディスク上のデータファイル、アスキーセーブのプログラムをRS232Cで
送信するプログラム
10 input "File Name"; Fname$  ’読み込みたいファイル名のしてい
20 open Fname$ for input as #1       ’ファイルのオープン
30 open "COM1:N81NN" as #2  ’データ長8ビット、パリティ無し、ストプップビット1
40 If eof(1)=-1 then goto80   ’ファイルが終わりなら80行へ飛ぶ   
50 line input #1, D$
60 print #2, D$
70 goto40
80 close: end
D  PC98 MS-DOS
フロッピーディスク上のファイルをRS232Cで転送する場合、RS232Cの通信条件
の設定は SPEEDコマンドで指定します
A>SPEED
転送はCOPYAというコマンドを使います。File1.txt というファイルを転送する場合
A>COPYA File1.txt aux
MS-DOSではRS232Cでのファイル受信時にもCOPYAを使います。
ただし、筆者の調べた限り、Windows95のMS-DOSモード、MS-DOSプロンプト
にはCOPYAコマンドは用意されてません。
E  PC2001
  PC2001でテープに保存したデータファイルを読み込んで、RS232Cで外部に転送する
というのは可能ですが、あまりに使用に耐えないものなので、ここではその手のプログラム
は割愛します。メモリー上のデータの送信に主眼を置きます。
  メモリー上のバイナリデータを文字データに変換してRS232Cに送信するプログラム。
メモリー上の&HE000から&HE300までのデータを送信します。
10 Term J,0,4              ’データ長8ビット、パリティ無し、1200ボー
20 For I=&HE000 to &HE300
30 D=Peek(I)               ’メモリーのバイナリデータを読む
40 Print %1,HEX$(D);       ’文字型に変換してRS232Cから送信
50 Next
BASICプログラム送信の試み
  機械語でないとBASICプログラムをRS232Cで送信するプログラムはできなさそう
ですが、PC2001の技術資料がなく、機械語での試みは難儀をきわめています。
ROM部(BASICシステム)を全部DOS/Vに転送し、DOS/VにPC2001
ディスアセンブラを作成し、それでROM解析をして、PC2001のROMルーチン
を利用したRS232C転送プログラムを機械語で組むという構想を描いておりますが、
ROMの解析がすすんでおりません。
  そこで、All BasicでRS232C経由でプログラムをやりとりするものができないかという、
安易な考えに取り付かれ、ちょっとBASICに浮気しました。
10回以上PC2001を暴走させた結果、まったく実用にはならないひどいものながら、
PC2001<-->DOS/VでBasicプログラム(中間コードとして)をやりとりする試験用プログラム
の作成に成功しました。これはPC2001のBasicプログラムをRS232C経由で入出力
するものです。
start address E001
end address E2EE
 5 TERM  J, 0, 4
 10 INPUT  "peek..p  poke..q  teso..t シリアルout...o  シリアルin...i  program start..s";Q$
 15 IF  Q$ = "i" THEN  GOTO   140
 16 IF  Q$ = "o" THEN  GOTO  c
 18 IF  Q$ = "s" THEN  GOTO   200
 20 IF  Q$ = "p" THEN  GOTO   30
 22 IF  Q$ = "t" THEN  GOTO   110
 25 IF  Q$ = "q" THEN  GOTO   60
 28 GOTO   10
 30 INPUT  "adreess";A
 40 FOR  I = A TO  A +  20
 45 PRINT  HEX$(PEEK(I)) + ",";
 50 NEXT 
 51 PRINT 
 55 GOTO   10
 60 INPUT  "adress"; W
 70 PRINT  HEX$(W);:INPUT  "data";D
 80 IF  D >  =  256 THEN  GOTO   10
 90 POKE  W,D
 95 W = W +  1
 100 GOTO   70
 110 INPUT "テンソウモトstart address";ST:INPUT "end address";EN:INPUT  "テンソウサキ(&h    )";AD:
 115 FOR  I =  0 TO  EN - ST
 120 POKE  AD + I,PEEK(ST + I)
 125 NEXT 
 130 GOTO   10
 140 I =  0
 145 INPUT  % 1, K$
 150 IF  K$ = "ok" THEN  GOTO   10
 155 POKE  &HE500 + I, VAL("&h" + K$)
 158 I = I +  1
 160 GOTO   145
 170 FOR  I = &HF90C TO  &HF90F
 175 PRINT  % 1, HEX$(PEEK(I)) + ",";
 180 NEXT 
 185 FOR  I = &HE000 TO  PEEK(&HF90E) + PEEK(&HF90F) *  256 -  65535
 190 PRINT  % 1, HEX$(PEEK(I)) + ",";
 195 NEXT 
 198 GOTO   10
 200 REM  
 3 
このリストは自分自身をRS232C経由でDOS/Vに送り、DOS/V上に作った、
PC2001中間コード解析プログラムでテキスト化したものです。
RUNするとコマンド待ちの状態になります。
pで指定番地から20個分メモリダンプします。
qで指定番地のメモリに書き込みます。
tでメモリの内容を転送元指定番地から転送先にブロック転送します。
oでプログラムをRS232Cより転送します。まずbasicプログラム開始番地、
終了番地を転送し、つづいて中間コードを転送します。
iでRS232Cより受信したデータを&HE500番地よりストアします。"OK"を
受信すれば終了。
sで行番号200に飛びます。200以降に本来のプログラムを追加すれば、そのプログラム
が実行されます。
プログラムの転送はoで自動的にやります。しかし、入力(すなわちロード)はやっかいです。
iコマンドで&HE500にストアしたのち、tコマンドで適切な番地に転送します。
お、その前にqコマンドでプログラム終了番地を修正しなくてはなりません。
(解析の結果、Basicプログラム終了番地は&HF90E,&HF90Fに格納されて
いることがわかっている。)ただし、このプログラムで、すなわちPOKEで&HF90E,
&HF90Fにデータ書き込みすると、(ここは本来システム領域なので、書き込み禁止)
暴走して何も表示しなくなる。しかし、一度電源をOFFして、再度ONすると無事
復帰する。(PC2001のメモリは不揮発メモリなので電源OFFでもプログラムは
消えない)いずれにせよ、こういう使えないしろものです。
いずれのプログラムにしても、この200行までの部分を瘤のようにつけておけば、
RS232C経由で転送、受信できるという、まったく馬鹿げたしろものです。
BASICではこういう瘤のようなものしかできないでしょう。
ちなみに、この実験ようプログラムはGOTOの多用というプログラミング自体
最低なものですが、まあ、実験ようなので気にしない、気にしない。
(3) DOS/V機でのRS232Cによるデータ送受信他
 いままで、データの送信について主にのべました。データの受信も各パソコンでできますが、
目下、筆者の主眼は古いパソコンのデータファイル、各言語のソースファイルをDOS/V機
に持ってくることなので、データの受信については、DOS/V機でしか深く検討しておりません。
 DOS/V機上ではWINDOWS95以上で動作するきちんとしたRS232C通信プログラムを 
作成しておりますが、プログラム自体も長大なものになっておりますので、ここでの説明は
省略します。当原稿に関連したプログラムとしては以下のものを作成済みです。
関連サイトのパソコン活用研究5番街にいくつか掲載していますので、参照して下さい。
@ PC2001
*RS232Cによるプログラムローダー(All 機械語) これは、ふるーいThe Basicの記事を
 参考に組んだものです。機械語でPC2001のBASICプログラムをRS232Cで送受信
 するものです。
A DOS/V 
*RS232Cによるシリアルデータ送受信プログラム
*PC2001中間コード解析 昔、FM-8とPC2001をカセットインターフェイス
 で結線しデータ送信させました。この時PC2001から送信したPC2001のBasic
 プログラムの中間コードをFM-8上で解析し元のテキストファイル化するプログラムを
 組みました。それを移植したものです。
*PC2001ディスアセンブラ これも昔FM-8で組んだものの移植です。PC2001
 のROM部(BASICシステム)のデータを解析するために作成。
当原稿はRS232Cによるシリアルデータ通信の概説を主眼にしておりますので、上記
プログラムの説明は別の機会にということにします。なお、昔やったPC2001とFM-8間の
データ通信については、拙著「PCList解説−FM8とPC2201データ通信プロジェクト」
にまとめましたので、そちらを参考にして下さい。シリアルデータ通信について別の角度から
とりあげてます。

TopPageへ


inserted by FC2 system