このエントリーをはてなブックマークに追加
スポンサーリンク

ロゼッタストーン

ロゼッタストーンとは 

ロゼッタストーンとは、古代文字で同じ意味の文章が3ヶ国語で刻まれている石です。そこから転じて、ここでは同じ意味になるシーケンスをさまざまなプリンターのシーケンスで記します。

パラメーターはテキスト、バイナリ、特殊の3種類あります。

テキストとは
テキストエディターで扱う事のできる文字です。30H〜7FH、A0H〜DFHまでのコードの集合体です。たとえば、テキストで100と指定するのであれば、31H 30H 30Hとなります。

長所は、BASICのPRINT文で簡単に送信できるという事、そして、COBOLとの相性がとても良いという事が挙げられます。例えばCOBOLでPIC 9(03)と定義する事で、容易にテキストの001、002、003・・・という文字列がセットできます。

短所は1桁につき1バイトを要するという事と、アセンブラ言語ではバイナリをテキストに変換しなければならないという点です。

バイナリとは
バイナリとは、16進数が直接数値を表すものを言います。たとえば1なら01H、2なら02Hです。

長所は、扱うバイト数が少なくて済むという事です。1バイトあれば符号なしなら0〜255、符号付きなら-128〜127までの値が扱えます。また、2バイトあれば符号なしなら0〜65535、符号付きなら-32768〜32767までを扱う事ができます。プリンターに送信するシーケンスにおいて、32767より大きい値を扱うケースはほとんどなく、大抵は2バイトで足ります。

また、アセンブラ言語やC言語との相性が良く、アセンブラ言語ならDBやDW、C言語ならcharやshortと定義しておけばそのまま値を代入する事ができます。

短所は、COBOL言語との相性が非常に悪い事です。COBOL言語でも PIC 9(02) COMPと定義する事でバイナリの変数を定義できますが、これだと99までしか代入できません。また、PIC9(03) COMPでは999までを代入するために3バイト確保してしまいます。つまり、COBOLでバイナリを扱うためには何らかの方法で変換する必要があるわけです。

▽値をバイナリに変換する方法の例

	01 MEI1. 
		03 FILLER	PIC X(01) VALUE X"1B".
		03 FILLER	PIC X(01) VALUE "$".
		03 MEI1B-1	PIC X(02).
	01 BINH			PIC 9(05) COMP.
	01 FILLER REDEFINES BINH.
		03 FILLER	PIC X(01).
		03 BINH2	PIC X(02).
	01 FILLER REDEFINES BINH.
		03 FILLER	PIC X(01).
		03 BINHA	PIC X(01).
		03 BINHB	PIC X(01).
	01 BINHC		PIC X(02).

                        :
                    (省略)
                        :

	BINCONV.
		MOVE	BINHA TO BINHC.
		MOVE	BINHB TO BINHA.
		MOVE	BINHC TO BINHB.

また、パラメーターがシフトJISコードの第一バイト(80H〜9FH、E0H〜FFH)と重なる可能性もあるため、ドライバーの方でシーケンスを解析して透過処理を行う必要があります。

また、バイナリの表記にはリトルエンディアンという表記があり、この場合下位バイト、上位バイトの順で並べなければなりません。アセンブラで扱うにしても、8086系と6809系ではエンディアンが異なるため、場合によっては上位バイトと下位バイトを入れ替える必要が出てきます。

表記について

ESCは、16進数で1BHです。
FSまたはCEXは16進数で1CHです。(CEXはFMプリンターでの呼び名です。)
SPはスペース(20H)です。
 ̄は7FHです。

その他の記号はキャラクターコードの通りです。

パラメーターは太字で表し、テキストを青、バイナリを赤、バイナリのリトルエンディアンを紫で表します。テキストとバイナリの違いについては、このページの最初の方を見てください。

漢字オン/漢字オフ

漢字オン
漢字モードにします。このコードを受信すると、以後は2バイトずつ1組のJISコードとみなされます。

機種 コマンド
PC PR201 ESC K
ESC/P FS &
J31DMP01 ESC $@
FM PR201 ESC $B
CZ-8PC5 ESC K

それにしても、シフトJISコードを直接扱ってくれるプリンターが当時なかったのは残念です。MS-DOSでは内部でシフトJISで扱うので、ドライバーの方で[漢字オン][JISコード][漢字オフ]に変換しなければなりませんでしたので・・・。

漢字オフ
漢字モードを終了し、以後はシングルバイト文字が印字されます。

機種 コマンド
PC PR201 ESC H
ESC/P FS DC2
J31DMP01 ESC ( J
FM PR201 ESC ( H
CZ-8PC5 ESC H

厳密には、PC PR201には「漢字オフ」というコマンドはありません。半角のいずれかのフォント(HDパイカ、エリート、コンデンス等)を指定する事で半角モードになります。ここでは、標準の「HDパイカ」を指定しています。

文字間ピッチ指定

半角固定ピッチ

機種 HDパイカ ドラフト エリート プロポーショナル コンデンス
PC PR201 ESC H ESC N ESC E ESC P ESC Q
ESC/P ESC P ESC x ESC M ESC p 01 ESC ! 02
J31DMP01 ESC N ESC %1 ESC E ESC Q
FM PR201 ESC Q 1 SP  ̄ CEX T
CZ-8PC5 ESC R ESC E ESC Q

パラメーターは、赤がバイナリ、青がテキストです。バイナリとテキストの違いは、このページの上の方に書いてあります。

シャープにはドラフトとプロポーショナルの指定がありません。ESC EがエリートなのでESC Pがプロポーショナルになりそうなものなんですが、実際には「漢字オフ」という意味になってしまうので・・・。

FMではパイカ、エリート、コンデンスという指定がありませんで、可変ピッチで指定します。

半角可変ピッチ

機種
PC PR201 FS w 00,00.
ESC/P ESC SP 00
J31DMP01 ESC : 000
FM PR201 ESC [ ;00 SP G
CZ-8PC5 FS T 00 00

パラメーターは、赤がバイナリ、青がテキストです。バイナリとテキストの違いは、このページの上の方に書いてあります。

文字間ピッチを指定する部分は、ぱっと見てわかりやすいように00と書いていますが、実際には00ではなく指定したい値を入れてください。

NECとシャープは、右に足すスペース、左に足すスペースと2つ指定します。その他の機種については、右に足すスペースのみを指定します。

FMでは「パイカ」「エリート」という指定がありませんで、可変ピッチの指定で代用します。文字間ピッチとして18を指定するとパイカ、15を指定するとエリートになります。

スペースはいずれもドット単位です。大抵のプリンターは1ドット1/180インチです。

全角文字間ピッチ

機種 10CPI 12CPI 13.3CPI
PC PR201 FS B FS C FS A
FS p 2,1/5. FS p 2,1/6. FS p 2,3/20.
ESC/P FS S 06 06 FS S 03 03 FS S 00 03
J31DMP01 ESC : 036 ESC : 030 ESC : 027
FM PR201 CEX $ 23 76 CEX $ 23 70 CEX $ 22 77
CZ-8PC5 FS S 06 06 FS S 03 03 FS S 00 03

多くのプリンターでは、全角の文字間ピッチは10CPI、12CPI、13.3CPIと指定するのではなく、左右のドットスペース量を調整して設定します。

NECは全角の文字間スペースを自由に設定する事ができず、あらかじめ決められた文字間の中から選択する事になります。(文字間スペースを設定するFS wでは、半角にも影響を与えてしまいます。)

全角と半角を2:1にするには、半角の文字間ピッチを10CPIならパイカ、12CPIならエリートを指定するのですが、NECでは半角に13.3CPIを設定する事ができません。このため、NECで半角を13.3CPIにするためには、「半角漢字」というものを使用します。(詳しくはNEC PR-201のページを御覧ください。)

シャープは多くのコマンドがNECに近いのですが、ここではなぜかESC/Pと同じです。どうも、後付で拡張していった結果こうなった感じがします。

改行幅

機種 1/6インチ 1/8インチ n/180インチ n/120インチ
PC PR201 ESC A ESC B ESC T 000
ESC/P ESC 0 ESC 1 ESC 3 00
J31DMP01 ESC U 06 ESC U 08
FM PR201 ESC Q 1;6 SP G ESC Q 1;8 SP G ESC Q 0/180 SP G
CZ-8PC5 ESC 6 ESC 8 ESC %9 00

NEC、シャープ、東芝では、最小単位が1/120インチです。ESC/PとFMでは最小単位が1/180インチです。

東芝では、改行幅にn/120インチという設定ができず、1/120インチ単位で改行したい時は、それとは別にESC Wコマンドで改行させます。

n/180インチ、n/120インチのところにある「0」や「00」は、ぱっと見わかりやすいように0としましたが、実際には0を送信するのではなく、設定したい値を送信してください。青がテキスト、赤がバイナリです。つまり、青で000なら、3バイトで30H 30H 30Hです。赤で00なら、1バイトで00Hです。

水平印字位置指定

機種 指定方法 単位
PC PR201 ESC F 0000 1/160インチ
ESC/P ESC $ 00 00 1/180インチ
J31DMP01 ESC Z 00 00
FM PR201 ESC [ 0 ` 1/180インチ
CZ-8PC5 ESC POS 000 1/180インチ

水平印字位置をドット単位で指定します。1ドットは大抵は1/180インチですが、NECでは1/160インチです。

移動量は、ここではわかりやすいように0000とか00と表記しましたが、実際は0ではなく移動する量を指定します。青がテキスト、赤がバイナリで、紫がバイナリのリトルエンディアンです。NECならESC Fに続いて4バイトのテキストで指定します。つまり、10なら、テキストで0010、バイナリで 30H 30H 31H 30Hになります。

ESC/Pはバイナリの2バイトですが、リトルエンディアンなので注意が必要です。8086アセンブラならそのままMOVすればリトルエンディアンになりますが、6809アセンブラだと、STD #メモリ等でメモリにセットするとビッグエンディアンになってしまうので、事前にEXG A,Bで上位バイト/下位バイトを入れ替えておく必要があります。

東芝はビッグエンディアンで指定します。8086アセンブラでMOV [メモリ],AXのようにするとリトルエンディアンになってしまうので、事前にXCHG AH,ALで上位バイト/下位バイトを入れ替えておく必要があります。

東芝は絶対位置指定という命令がありませんで、現在のヘッドの位置からの相対位置指定になります。しかし、マイナスを指定する事はできず、現在位置より左に移動させる事はできません。

文字修飾

機種 強調 イタリック アンダーライン SPスクリプト SPサブスクリプト
指定 解除 指定 解除 指定 解除 設定 解除 設定 解除
PC PR201 ESC ! ESC " ESC X ESC Y ESC s1 ESC s0 ESC s2 ESC s0
ESC/P ESC E ESC F ESC 4 ESC 5 ESC - 01 ESC - 00 ESC S 00 ESC T ESC S 01 ESC T
J31DMP01 ESC %5 ESC %6
FM PR201 ESC [ 4 m ESC [ 0 m CEX N CEX O CEX P CEX Q
CZ-8PC5 ESC ! ESC " ESC X ESC Y ESC s1 ESC s0 ESC s2 ESC s0

機種によってはイタリックや強調の機能がないものがあります。シャープはここではNEC互換のようです。

外字登録

機種 書式 フォーマット 登録できる範囲
PC PR201 ESC + 76 20 データー・・・ 縦スライス
LSB
MSB
7620H〜7674H
ESC/P FS 2 77 21 データー・・・ 縦スライス
MSB
LSB
7721H〜777EH
J31DMP01 ESC 9 FF FF 2B 21 データー・・・ 横スライス
上位4ビットは3に固定
MSB LSB
2B21H〜2B7EH
2C21H〜2C7EH
2D21H〜2D7EH
FM PR201 CEX SP 28 21 データー・・・ 横スライス
上位4ビットは3に固定
MSB LSB
2821H〜287EH
2921H〜297EH
CZ-8PC5 ESC + 76 21 データー・・・ 縦スライス
MSB
LSB
7621H〜767EH
7721H〜7726H

ここで、登録アドレスは、ぱっと見てわかりやすいように例として登録可能なアドレスの最小値を書いてますが、実際には登録するアドレスを指定してください。いずれもビッグエンディアンです。

NECとESC/Pとシャープは縦スライスです。フォントをタテに分解して、3バイトで縦1列分のデーターを表します。ただし、NECとESC/P シャープではMSBとLSBが逆です。

シャープは、コマンドはNECと同じなのに、データーのフォーマットはESC/Pと同じです。

富士通と東芝は横スライスです。フォントを横に分解して、6バイトで横1行を表します。上位4ビットは3に固定されているため、シフトJISの第一バイトとかぶる心配がありません。


イメージ印字

機種 8ビット 16ビット 24ビット フォーマット
PC PR201 ESC S 0000 ESC I 0000 ESC J 0000 LSB
MSB
ESC/P ESC * 00 00 00
ESC * 01 00 00
ESC * 02 00 00
ESC * 03 00 00
ESC * 04 00 00
ESC * 06 00 00
ESC * 20 00 00
ESC * 21 00 00
ESC * 26 00 00
ESC * 27 00 00
ESC * 28 00 00
   
MSB
LSB
J31DMP01 ESC I 00 00
ESC * 00 00
MSB
LSB
FM PR201 ESC Q 0 SP W
ESC Q 0 SP V
ESC Q 0 SP X
MSB
LSB
CZ-8PC5 ESC %2 00 00 ESC I 0000 ESC J 00 00 MSB
LSB

イメージ印字は、FMや東芝いずれも縦スライスです。
NECのみLSBが上です。
ESC/Pではさまざまな密度が用意されていますが、縦16ビットがありません。
ESC/Pは、赤字の部分はバイナリで固定値です。紫の00 00の部分に列幅をリトルエンディアンで指定します。
富士通は列幅は可変長テキストで、スペースで区切ります。ここでは0としましたが、実際には列幅をテキストで指定します。
NECは列幅は4桁のテキストで指定します。0000の部分には実際には列幅を入れます。NECの場合、区切りの文字で区切るのではなく、4桁で固定です。4桁未満の場合は頭に0を補います。
シャープは、なぜか16ビットイメージ転送のみ列幅をテキストで指定します。どうも、後から色々な人が建て増しした感じがします。

スポンサーリンク