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

PC-PR201系制御コード

PC-PR201

PC-PR201はドットプリンタです。ドットプリンタは、循環式の布のインクリボンごしにヘッドを用紙に打ち付ける事で文字を印刷します。そのため印刷時にはかなり大きな音がします。

ドットプリンタを使うケースのほとんどは、複写式の伝票に印刷をする場合です。複写式の伝票は、間にカーボンが挟んであったり、インクがカプセル状に吹き付けられていて圧力がかかるとカプセルがつぶれてインクが出るようになっていたりします。なので、インクジェットや熱転写のような圧力のかからない印刷方式では2枚目以降に文字が複写されません。

PC-9801全盛期の頃、PC-9801でMS-DOSで動作する業務アプリが多く作られました。そして、帳票の印刷ではPC-PR201系プリンターが多く使われました。そのため、業務アプリの世界ではPC-PR201系の制御コードを対象としたものが多く存在します。現在もESC/Pスーパーの制御コードを持つレーザープリンター等でPR-201系の制御コードも受け付けてくれるプリンターが現存しています。

PC-PR201系の制御コードの特徴として、イメージ印刷や外字登録以外のコマンドでは、バイナリデーターを直接送信しません。値を指定する場合、テキストコードである0x30~0x39で指定するものがほとんどです。したがって、プリンタードライバー内でシフトJIS→JISコード変換を透過する処理も、イメージ印字と外字印字だけを考慮すれば良いため、比較的処理が単純になります。

PR-201系のプリンターはJIS-78系の漢字コードを持っているため、PC-9801に接続して使う分には問題はないのですが、AT互換機に接続して使う場合、一部機種依存文字が画面には表示されるのに印刷には出ない場合が出てきます。そこで、プリンタードライバー内で機種依存文字のコード(①②③…や、㈱㈲㈹など)を変換しています。それでも、桧や篭など一部の文字は対応しきれておりませんで、画面に出た文字と印刷の文字が異なってしまうものもあります。当時はGoogleなんて便利なものがなくて、機種依存文字に関する資料が集めきれませんでした。

VFUの設定

VFU(Virtical Format Unit)は、1ページのフォーマット(ページ長、垂直タブ、ボトム領域)をあらかじめ設定しておき、アプリの方では単純に垂直タブ、改行、改ページのみでページレイアウトに関する制御を行わないで済むようにする機能です。

また、後で用紙のフォーマットが変更になった時には、VFUの設定のみを変更すれば良いという利点もあります・・・が、まぁ正直言ってそんな機能使いませんでした。結局、ページのレイアウトはプリンター側ではなく、アプリ側で管理すれば済む話ですし・・・。っていうか、誰かこの機能使いました??

VFUの設定は、GS、TOF、ページデーター・・・・、TOF、RSというフォーマットで設定します。GSは16進数で1D、RSは16進数で1Eです。

TOFおよびデーターは2バイトで1組のデーターです。つまり、16ビット幅を持ったデーターです。しかし16ビットのうちの9ビットはNC(Not Connect:未使用)、1ビットは1に固定なので、実際には6ビットずつしか情報をもたせる事ができません。

NC 1に固定 ch6 ch5 ch4 ch3 ch2 ch1 NC NC NC NC NC NC NC NC

多分、将来的に拡張できるように16ビット幅を持たせたんだと思いますが、得てしてそういう場合に限って将来的な拡張はないものです。

このサイトで掲載しているPC PR-201プリンタードライバーでは、VFUの設定の所ではシフトJISコードの透過処理を行ってしません。なので、VFUを設定する際は少なくとも最上位ビットは0にしてほしいのです。なので、ここではNCのビットを全て0で統一する事にします。ちなみに、以前「VFU設定時に漢字変換してしまう」というクレームが来た事がありましたが、んなの、未定義ビットを立てるのが悪いんじゃないかと。(普通は未定義のビットは0にしません?)

TOFとは、ページの先頭を意味します。(Top Of ・・・ 何でしょう?)、TOFとTOFに挟まれたデーターが、垂直タブやボトム領域の設定となります。

TOFは、ch1に1、他のビットを全て0にしたものです。具体的には、
01000001 00000000
です。16進数では 41 00 です。(注1)

ボトム位置は、ch1とch2をともに1にしたものです。つまり、
01000011 00000000
です。16進数では43 00 です。(注1)

(注1)なお、この辺の計算や0の数が間違っていても、決して教えてgooやYahoo知恵袋に晒す事はやめてください。掲示板やご意見フォームで密かに教えていただければ、密かに修正しますので、ご勘弁を。

ボトム位置にch3~ch6のビットを立てて、タブ3~タブ6を設定する事は可能です。(その場合、43 00 ではなくなります。) しかし、1行目にはタブを設定する事ができず、また、ボトム行にはタブ2を設定する事ができません。これは、TOFのch2~6は0でなければならず、ボトム行のch2は1に固定されているためです。

ボトム位置より下の行はボトム領域とみなされ、用紙がボトム領域まで送られると自動的に次のページの先頭へ改ページ(連続帳票の場合は紙送り)されます。

ch1~ch6までの全てのビットが0のデーターは「通常行」とみなされます。具体的には、
01000000 00000000
です。16進数では40 00です。(多分)

ch1のビットが0、ch2~ch6のビット1のデーターは「垂直タブ行」です。
ch2 ・・・ タブ2
ch3 ・・・ タブ3
ch4 ・・・ タブ4
ch5 ・・・ タブ5
ch6 ・・・ タブ6
それぞれ該当するビットが立っている行がタブ行とみなされます。という事は、同じ行に複数のタブを設定する事ができます。(例えば、3行目はタブ2とタブ4、みたいに)

例えば、
1D ・・・ GS
41 00 ・・・ 1行目
40 00 ・・・ 2行目
40 00 ・・・ 3行目
43 00 ・・・ 4行目 ボトム行
40 00 ・・・ 5行目 ボトム領域
40 00 ・・・ 6行目 ボトム領域
41 00 ・・・ 次の行の1行目
1E ・・・ RS
とした場合(注:赤い字は注釈です)、1ページは6行で、4行目はボトム行、5行目6行目はボトム領域とみなされます。ここに、垂直タブを設定したい場合は、40のかわりに該当するビットを立てて送信します。なお、ここでは説明のために1ページをたったの6行としましたが、通常1ページは66行でしょうから、66行分のデーターを送信します。

設定された垂直タブは、
1F 02 が送信されればタブ2
1F 03 が送信されればタブ3
1F 04 が送信されればタブ4
1F 05 が送信されればタブ5
1F 06 が送信されればタブ6
にそれぞれ行送りされます。たたし、タブ2に関しては、単なるVT(=0BH)で代用できます。電源投入時は、1ページは66行、タブ2は6行毎、タブ3~タブ6は未設定となっています。

え?サッパリわかんない?そうでしょう。私もよくわかりません。まあ、これに凝りたらVFUなんか使わずに、用紙のレイアウトはアプリ側で管理するのが良いかと。

ESCシーケンス

1/6インチ改行
ESC A(1B 41)
改行幅を1/6インチにします。初期値です。

1/8インチ改行
ESC B(1B 42)
改行幅を1/8インチにします。縦罫線を繋げる場合に使用します。

n/120インチ改行
ESC T (1B 54)
改行幅をn/120インチに設定します。ESC T に続いて、テキストで2桁で指定します。つまり、1/120インチに指定したい時は、 ESC T 01(1B 54 30 31)と指定します。

;-----------行間つめる
TUME		=	$
		CMP	[JMODE],BYTE PTR 0
		JE	TUME1
		JMP	TUME2

TUME1		=	$
		MOV	BX,OFFSET T17
		MOV	CX,4
		CALL	INSATU
		JMP	HOUKOU

TUME2		=	$
		MOV	BX,OFFSET T18
		MOV	CX,4
		CALL	INSATU
                     :
                   (省略)
                     :
T17		DB	1BH
		DB	"T17"
T18		DB	1BH
		DB	"T18"

技術評論社のPC-PRハンドブックでは、他にデュップスイッチがどうのこうの書いてあるのですが、サッパリわかりません。どうもこの本、よくわかってない人が書いてるんじゃないかと思います。

水平タブ設定
ESC ( (1B 28)
水平タブを設定します。技術評論社のPC-PRハンドブックでは、ESC ) となっていますが、ESC (の間違いです。

水平タブ解除
ESC ) (1B 29)
水平タブを解除します。技術評論社のPC-PRハンドブックでは、1B 28 となっていますが、1B 29 の間違いです。どうやら、水平タブの記事を書いている途中で目がワープして、水平タブ解除の内容にドッキングしてしまったようです。

水平タブ設定、垂直タブ設定、ともにパラメーターは3桁のキャラクターで指定します。3桁に満たない時は、頭に0を入れます。COBOLでいうところのPIC 9(03)です。多分、COBOL言語からプリンターを制御するのに都合の良いように作ってあるんだと思います。(COBOLでは可変長の文字列を扱いにくいので。)

また、カンマで区切り、最後はピリオドで終わらせます。また、FM-PR201のような1/180インチ単位では設定できず、キャラ単位でしか設定できません。

例えば、1カラム、10カラム、20カラムに水平タブを設定するのであれば、
ESC ( 001,010,020.
とします。

また、この中から、10カラム目を解除するのであれば、
ESC ) 010.
とします。

水平タブオールクリア
ESC 2 (1B 32)
水平タブをオールクリアします。

左マージン
ESC L (1B 4C)
左マージンを設定します。キャラクター単位です。パラメーターは3桁のテキストです。たとえば1と設定するのであれば、ESC L 001と指定します。

右マージン
ESC / (1B 2F)
右マージンを設定します。キャラクター単位です。パラメーターは3桁のテキストです。たとえば1と設定するのであれば、ESC / 001と指定します。

リセット
ESC c1 (1B 63 31)
プリンターを電源投入時の状態にします。全てを工場出荷時に戻すわけではありません。用紙長や片方向印字などをデュップスイッチによってモードを切り替えている場合はそのままです。

片方向印字
ESC > (1B 3E)
ヘッドが左から右へ移動する場合のみ印字をして、右から左へ移動する場合は何も印字しません。これによって印刷の速度は半分、つまり印刷に倍の時間がかかるようになります。

昔のプリンターはステップモーターの精度が低かったため、両方向印字をさせると、ヘッドが右→左と、左→右の時で印字がズレる場合があります。その場合、片方向印刷を指定すると良いでしょう。

当サイトに掲載しているハードコピードライバーでは、基本的に片方向印字ですが、/Wオプションを指定する事で両方向印字を行う事ができます。最近(2018年現在)のインクジェットプリンターでは、ステップモーターの精度が昔より遥かに向上しているため、両方向印字でも印字がズレる事はまずありません。

;-----------片方?両方?
HOUKOU          =       $
                CMP     [WFLG],BYTE PTR 0
                JE      KATAMODE
                JMP     RYOMODE

KATAMODE        =       $
                MOV     BX,OFFSET KATAHO
                MOV     CX,2
                CALL    INSATU
                JMP     HARDC

RYOMODE         =       $
                MOV     BX,OFFSET RYOHO
                MOV     CX,2
                CALL    INSATU
                JMP     HARDC

HARDC           =       $


           :
        (省略) 
           :
KATAHO          DB      1BH
                DB      ">"
RYOHO           DB      1BH
                DB      "]"

両方向印字
ESC ] (1B 5D)
片方向印字を解除して、両方向印字を行います。ただし、デュップスイッチによって片方向印字モードに切り替えている場合は、片方向印字のままです。

逆方向改行
ESC r (1B 72)
以後の改行は逆方向になります。ただし、連続帳票(ストックフォーム)で印刷してる時に逆方向改行を行うと、かなりの高確率で用紙がジャムるので、やめておいた方が無難です。なにしろチェーンストア統一伝票とか高いので、ジャムらせると勿体無いですよ?

順方向改行
ESC f (1B 66)
逆方向の印字を解除します。

高速パイカピッチ
ESC N (1B 4E)
字が薄くなるかわりに、印字が高速になります。

高密度パイカピッチ
ESC H (1B 48)
電源投入時のモードです。通常はこのモードにします。

エリートピッチ
ESC E (1B 45)
文字のピッチが12CPIになります。

コンデンスピッチ
ESC Q(1B 51)
小さい文字になります。

プロポーショナルピッチ
ESC P (1B 50)

プロポーショナルピッチは、文字によってピッチが異なります。見た目は美しくなりますが、漢字:ANKの文字感ピッチが2:1にならないので表で使うと崩れてしまいます。当時のBASICやMS-DOS上のアプリのほとんどは、横方向の印字位置を文字やスペース(20H)で合わせていたため、漢字:ANKが2:1でないと表示が崩れてしまいました。

▽COBOL時代のプリントレイアウト設計書


Windowsでは通常、ほとんどの文字はプロポーショナルピッチです。これは、Windows上のアプリはほとんどが項目ごとにカラムの絶対位置を持っているためです。

▽Accessのプリントレイアウト


横書き漢字
ESC K(1B 4B)

縦書き漢字
ESC t(1B 74)

PC-PR201系の制御コードでは、ESC/Pのような明確な「漢字オン」「漢字オフ」といったコマンド体系ではなく、「書体の変更」というコマンドで半角/全角の切り替えを行います。つまり「横書き漢字」が事実上の「漢字オン」で、「HDパイカ指定」が事実上の「漢字オフ」となります。

縦書き漢字、HSパイカ、コンデンス、エリート、プロポーショナルは別途アプリ層で送出すれば使用可能になりますが、半角/全角まりじの文字列を印刷する際に、プリンタードライバー(NPRINTER.SYS)の方で全角文字を送出する前に「横書き漢字」、全角文字を送出した後に「HDパイカ指定」を送出していますので、アプリ層の方でプリンタードライバーのコード変換機能をオフにした上で自前のルーチンで漢字コード変換を行う必要があります。

という事なので、PC-PR201系のコード体系では、数値などの確実に半角のみとわかっている文字列を打つ場合以外を除いて、HSパイカ、コンデンス、エリート、プロポーショナルのフォントは使いづらいのではないかと思われます。

全ての印字を縦書きにする場合であっても、半角/全角混じりの文書を印刷する時には、「漢字オン」に相当する文字が「横書き漢字」なので、プリンタードライバーのJISコード変換が使えません。プリンタードライバーを通さずに、ANKを全て全角に変換した後、縦書き漢字オンに続いて独自にJISコードに変換してプリンターに送信した後、最後に横書き漢字またはHDパイカにして解除しなければなりません。

というようなコード体系になっているため、ESC/Pに比べてPR 201系は普及しなかったと思います。個人的には、パラメーターのほとんどをバイナリで指定しなければならないESC/Pは、 パラメーターがシフトJISの上位バイトとバッティングする可能性があり、プリンタードライバーが複雑になるため、あまり好きではありません。

半角漢字縦書き
ESC h1(1B 68 31)
縦書き漢字モード時に送信すると、半角漢字も縦書きになります。

半角漢字とは、12ドットピッチの半角文字です。通常半角文字は16ドットピッチですが、半角漢字は12ドットピッチのため、24ドットピッチの全角漢字と1:2で印字できます。

半角漢字縦書き解除
ESC h0(1B 68 30)
縦書き漢字モード時に送信すると、半角漢字は横書きになります。デフォルトはこのモードです。

組み込み文字
ESC q(1B 71)
縦書き漢字モードで半角漢字縦書きモード時に半角漢字を2バイト続けて送信すると、2つで1つの文字になります。このコマンドには「解除」がありませんで、1回組み込み文字を印字すると自動的に解除されます。次に続く文字が2文字の連続した半角漢字でない場合は無視されます。



ひらがなモード
ESC &(1B 26)
8ビットモードの時は、カタカナの部分がひらがなになります。7ビットモードの時は英数の部分がひらがなになります。

カタカナモード
ESC $(1B 24)
ひらがなモードを解除します。7ビットモードの時は英数になります。

グラフィックキャラクターモード
ESC #(1B 23)
7ビットモードの時のみ有効。英数の部分がグラフィックキャラクターになります。

上付き文字印字
ESC s1(1B 73 31)
縮小文字モードになります。上付き文字になります。

下つき文字印字
ESC s2(1B 73 32)
縮小文字モードになります。下付き文字になります。

スーパースクリプト解除
ESC s0(1B 73 30)
縮小文字モードを解除します。どうでもいいけど、技術評論社のハンドブック、1B733Hって何だよ。(さては目がワープしたな!?)

拡大文字
ESC e(1B 65)
文字を拡大します。ESC eに続いて縦倍率、横倍率をテキスト1桁で指定します。といっても任意の倍率が指定できるわけではなく、倍率は1か2だけです。

例)
ESC e 11 ・・・ 等倍(拡大印字解除)
ESC e 21 ・・・ 縦2倍
ESC e 12 ・・・ 横2倍
ESC e 22 ・・・ 4倍

繰り返し文字
ESC R (1B 52)
文字を繰り返して印字します。ESC Rに続いて繰り返す文字数をテキスト3桁で指定して、その後に繰り返す文字を印字します。例えば、ESC R 080 - をすると、-記号を80文字印字します。罫線代わりに-記号を連続して印刷したい場合に便利です・・・といいたい所ですが、他社のプリンター(ESC/Pとか東芝とか)には同様のコマンドがないため、移植が面倒になるので、あまり使いませんでした。

繰り返す文字が1バイトだけしか指定できない事からもわかるように、このシーケンスは全角文字には使えません。

強調文字
ESC !(1B 21)
レーザープリンターや熱転写プリンターでは太字になります。ドットプリンターでは二度打ちして濃くします。

強調文字解除
ESC "(1B 22)

アンダーライン
ESC X(1B 58)
アンダーラインを引きます。

アンダーライン解除
ESC Y(1B 59)

ラインの種類指定
ESC _ (1B 5F)
アンダーラインにするかオーバーラインにするかを指定します。
ESC _ に続いて1か2をテキストで指定します。1はアンダーライン、2はオーバーラインになります。ここで設定したラインは、実際にはESC Xを受信すると引かれます。

ドットスペース
ESC ドットスペース (1B 01H~08H)
プロポーショナル文字もしくは全角文字の横にスペースを足します。プロポーショナルピッチに影響を与えてしまうし、半角:全角を1:2にするのであれば、1C 42Hが使えるので、あまり使いません。

水平位置絶対位置指定
ESC F (1B 46)
ヘッドを指定位置まで進めます。進める事はできても、戻す事はできません。現在のヘッドの位置より左が指定された場合は無視されます。

ちなみに、どうしてもヘッドを左に戻したい時は、改行幅を0にして改行コード(CR LF)を送信するという手もあります。

1ドット(1/160インチ)単位で指定できるため、手書きの指定伝票に位置合わせをする場合に便利です。

外字印字

プリンターに内蔵されていないフォントを、外字として登録する事ができます。NPRINTER.SYSでは、/UFOオプションを指定することでJFGAIJ.UFOファイルを読み込んで外字エリアに転送を行う事ができます。

外字登録
ESC + 外字コード データー・・・ (1B 2B 外字コード データー・・・)

ESC + に続いて外字コードを指定します。外字はコードは7620~7674です。ただし、ビッグエンディアンで指定するので、8086アセンブラを使っている場合は、上位バイト下位バイトを逆転させてから印字バッファにセットする必要があります。

例)
MOV AX,[ADDR2]
XCHG AH,AL
MOV [ADDR],AX

外字データーは72バイトのバイナリで指定します。JFGAIJ.UFOなどのフォントパターンは通常1バイトが横1スライスになっています。しかしこのコマンドでは1バイトが縦1スライスで指定するため、プリンターに転送する前に横スライスを縦スライスに変換する必要があります。

画面用フォントパタンを上から順に左にシフトしていき、1シフトごとにそれぞれキャリーフラグに押し出されたビットを、プリンター用フォントにシフトして読み込みませます。NEC系のプリンターでは上が下位ビットであるため、右にシフトする必要があります。

;==============================================================================
;           画面用フォント  →  プリント用フォント
;==============================================================================
P_HENKAN	=	$
		MOV	SI,OFFSET KANPAT  ;SI ・・・・・・・ 表示用先頭アドレス
		MOV	DI,OFFSET PRPAT	  ;DI ・・・・・・・ プリント用先頭アドレス
		MOV	[KAISU1],BYTE PTR 8
		MOV	[KAISU2],BYTE PTR 3

;		上8ドット
UEPUT		=	$
		SHL	BYTE PTR [SI+00],1
		RCR	BYTE PTR [DI+00],1
		SHL	BYTE PTR [SI+03],1
		RCR	BYTE PTR [DI+00],1
		SHL	BYTE PTR [SI+06],1
		RCR	BYTE PTR [DI+00],1
		SHL	BYTE PTR [SI+09],1
		RCR	BYTE PTR [DI+00],1
		SHL	BYTE PTR [SI+12],1
		RCR	BYTE PTR [DI+00],1
		SHL	BYTE PTR [SI+15],1
		RCR	BYTE PTR [DI+00],1
		SHL	BYTE PTR [SI+18],1
		RCR	BYTE PTR [DI+00],1
		SHL	BYTE PTR [SI+21],1
		RCR	BYTE PTR [DI+00],1

;		まん中8ドット
NAKAPUT		=	$
		SHL	BYTE PTR [SI+24],1
		RCR	BYTE PTR [DI+01],1
		SHL	BYTE PTR [SI+27],1
		RCR	BYTE PTR [DI+01],1
		SHL	BYTE PTR [SI+30],1
		RCR	BYTE PTR [DI+01],1
		SHL	BYTE PTR [SI+33],1
		RCR	BYTE PTR [DI+01],1
		SHL	BYTE PTR [SI+36],1
		RCR	BYTE PTR [DI+01],1
		SHL	BYTE PTR [SI+39],1
		RCR	BYTE PTR [DI+01],1
		SHL	BYTE PTR [SI+42],1
		RCR	BYTE PTR [DI+01],1
		SHL	BYTE PTR [SI+45],1
		RCR	BYTE PTR [DI+01],1

;		下5ドット
SITAPUT		=	$
		SHL	BYTE PTR [SI+48],1
		RCR	BYTE PTR [DI+02],1
		SHL	BYTE PTR [SI+51],1
		RCR	BYTE PTR [DI+02],1
		SHL	BYTE PTR [SI+54],1
		RCR	BYTE PTR [DI+02],1
		SHL	BYTE PTR [SI+57],1
		RCR	BYTE PTR [DI+02],1
		SHL	BYTE PTR [SI+60],1
		RCR	BYTE PTR [DI+02],1
		SHL	BYTE PTR [SI+63],1
		RCR	BYTE PTR [DI+02],1
		SHL	BYTE PTR [SI+66],1
		RCR	BYTE PTR [DI+02],1
		SHL	BYTE PTR [SI+69],1
		RCR	BYTE PTR [DI+02],1

		ADD	DI,3

;		前半8ドット分終った?
		SUB	[KAISU1],BYTE PTR 1
		CMP	[KAISU1],BYTE PTR 0
		JE	ZENHANE
		JMP	UEPUT

ZENHANE		=	$
		ADD	SI,1
		MOV	[KAISU1],BYTE PTR 8

;		後半8ドット終った?
		SUB	[KAISU2],BYTE PTR 1
		CMP	[KAISU2],BYTE PTR 0
		JE	KOUHANE
		JMP	UEPUT

KOUHANE		=	$
		RET

16x16外字登録
ESC * 外字コード 外字データー・・・
ESC * に続いて外字コードを指定します。外字はコードは7620~7674です。外字データーは32バイトのバイナリで指定します。縦2バイトx16列です。

ダウンロード文字登録
半角文字をプリンター内蔵フォントから登録したフォントに変更します。
プロポーショナル文字以外
ESC l 登録モード コード データー・・・
プロポーショナル文字
ESC l 登録モード 左ドットスペース 文字幅 右ドットスペース コード データー・・・

技術評論社のハンドブックではESC 1と書いてありますが、おそら写植屋が小文字のエルを数字の1と空目したのではないかと思われます。

登録モード
1 ・・・ HDパイカ(カタカナ)
2 ・・・ HSパイカ(カタカナ)
3 ・・・ エリート(カタカナ)
4 ・・・ コンデンス(カタカナ)
5 ・・・ プロポーショナル(カタカナ)
A ・・・ HDパイカ(ひらがな)
B ・・・ HSパイカ(ひらがな)
C ・・・ エリート(ひらがな)
D ・・・ コンデンス(ひらがな)
E ・・・ プロポーショナル(ひらがな)

左ドットスペース、右ドットスペースは1桁のテキストで指定します。
文字幅は2桁のテキストで指定します。
コードは21~7Fです。



1列は3バイトです。パイカは18列なので54バイト分送信しますが、最後の6バイトは何を送っても空白になります。エリートは16列分、コンデンスは14列分になります。プロポーショナルは(文字幅+1)列分です。最後の3バイトは何を送っても空白になります。

技術評論社のハンドブックでは下が下位ビットであるかのような図が掲載されていますが、実際には下が上位ビットになります。

当サイトで掲載しているNPRINTER.SYSでは、ESC l を受信すると、それに続くモードによって透過するバイトを判別しています。プロポーショナルの場合、文字幅x3+3バイト分透過しています。

;-------- ESC 小文字のl(エル)
CHK3		=	$
		CMP	CS:[KAKO3],BYTE PTR 1BH
		JE	$+5
		JMP	CHK4

		CMP	CS:[KAKO2],BYTE PTR "l"
		JE	$+5
		JMP	CHK4

		CMP	CS:[KAKO1],BYTE PTR "1"
		JNE	CHK3_1
		MOV	CS:[TOUKA_P],WORD PTR 56
		JMP	TOUKA_MODE_IN

CHK3_1		=	$
		CMP	CS:[KAKO1],BYTE PTR "2"
		JNE	CHK3_2
		MOV	CS:[TOUKA_P],WORD PTR 56
		JMP	TOUKA_MODE_IN
CHK3_2		=	$
		CMP	CS:[KAKO1],BYTE PTR "3"
		JNE	CHK3_3
		MOV	CS:[TOUKA_P],WORD PTR 47
		JMP	TOUKA_MODE_IN
CHK3_3		=	$
		CMP	CS:[KAKO1],BYTE PTR "4"
		JNE	CHK3_4
		MOV	CS:[TOUKA_P],WORD PTR 44
		JMP	TOUKA_MODE_IN
CHK3_4		=	$
		CMP	CS:[KAKO1],BYTE PTR "A"
		JNE	CHK3_5
		MOV	CS:[TOUKA_P],WORD PTR 56
		JMP	TOUKA_MODE_IN
CHK3_5		=	$
		CMP	CS:[KAKO1],BYTE PTR "B"
		JNE	CHK3_6
		MOV	CS:[TOUKA_P],WORD PTR 56
		JMP	TOUKA_MODE_IN
CHK3_6		=	$
		CMP	CS:[KAKO1],BYTE PTR "C"
		JNE	CHK3_7
		MOV	CS:[TOUKA_P],WORD PTR 47
		JMP	TOUKA_MODE_IN
CHK3_7		=	$
		CMP	CS:[KAKO1],BYTE PTR "D"
		JNE	CHK4
		MOV	CS:[TOUKA_P],WORD PTR 44
		JMP	TOUKA_MODE_IN

;-------- ESC 小文字のL プロポーショナルピッチ
CHK4		=	$
		CMP	CS:[KAKO6],BYTE PTR 1BH
		JNE	CHK5
		CMP	CS:[KAKO5],BYTE PTR "l"
		JNE	CHK5
		CMP	CS:[KAKO4],BYTE PTR "5"
		JE	CHK4_1
		CMP	CS:[KAKO4],BYTE PTR "E"
		JE	CHK4_1
		JMP	CHK5
CHK4_1		=	$
		PUSH	AX
		MOV	CS:[HK1],BYTE PTR 0
		MOV	CS:[HK2],BYTE PTR 0
		MOV	AL,CS:[KAKO2]
		MOV 	CS:[HK3],AL
		MOV	AL,CS:[KAKO1]
		MOV 	CS:[HK4],AL
		CALL	HENKAN
		MOV	AX,CS:[HK5]
		MOV	BX,3
		MUL	BX
		ADD	AX,3
		MOV	CS:[TOUKA_P],AX
		POP	AX
		JMP	TOUKA_MODE_IN

ダウンロード文字無効
ESC l - (1B 6C 2D)
ダウンロード文字を使わず内蔵文字を使います。

ダウンロード文字有効
ESC l + (1B 6C 2B)
ダウンロード文字を有効にします。つまり、「ダウンロード文字無効」の解除です。

ダウンロード文字削除
ESC l 0(1B 6C 30)
ダウンロード文字を全て削除します。

イメージ印字
1B S 列数 データー ・・・ 8ドットイメージ印字
1B I 列数データー ・・・ 16ドットイメージ印字
1B J 列数データー ・・・ 24ドットイメージ印字

列数は4桁で指定します。列数はテキストで4桁で指定します。4桁に満たない場合は左側に0を補います。例えば1列打つ時は0001です。24ドットイメージの場合、1列に対して3バイト分のデーターを用意します。

NEC系は他社のコード体系とは逆で、下位ビットが上になっているため、ドットを上から下へキャリーフラグを含んで右シフトしながら3バイト分ローテーションさせて作成します。



技術評論社の図では上が上位ビットであるかのように見える図が描かれていますが、実際には下が上位ビットになります。

例)
ドットの検査、ドットがあればSTC、なければCLCに続いて、
RCR BYTE PTR [LDAT3],1
RCR BYTE PTR [LDAT2],1
RCR BYTE PTR [LDAT1],1
を、ドットを縦に検査しながら24ドット分繰り返します。

できあがった1列分データーを必要な列分作成して、プリンターに送信します。プリンタードライバー(NPRINTER.SYS)ではこのバイナリバイト数分だけ透過モードとなり、シフトJIS→JISコードへの変換を行わなくなります。

コピーモード
ESC D(1B 44)
8ドットイメージ印字では、通常1ドットおきに隙間ができて16ドット幅で印字されます。コピーモードにすると、偶数ラインが上のドットで補完されます。


ネイティブモード
ESC M(1B 4D)
コピーモードが解除されます。電源投入時はこのモードです。


ドットリピート
1B V 列数 データー ・・・ 8ドットイメージ印字
1B W 列数データー ・・・ 16ドットイメージ印字
1B U 列数データー ・・・ 24ドットイメージ印字

1列分のデーターを送信した後、同じパターンを繰り返し印字します。つまり、横縞が印刷されます。列数は4桁で指定します。列数はテキストで4桁で指定します。4桁に満たない場合は左側に0を補います。例えば1列打つ時は0001です。

排出後給紙
ESC a (1B 61)
今入ってる紙を紙を排出した後、シードフィーダーから給紙します。改ページ(0C)と同じです。

排出
ESC b (1B 62)
現在入っている紙を排出しますが、給紙はしません。

簡易VFU
ESC v(1B 76)
VFUの設定は、先に説明した通り非常に長く複雑な設定が必要です。しかし、この簡易VFUを使う事によって、もう少し簡単に設定する事ができます。

ESC vに続いて、用紙長, ボトム位置, 垂直タブ, 垂直タブ, 垂直タブ, ・・・・ 垂直タブ.
と設定します。パラメーターはそれぞれ2桁のテキストで指定し、各パラメーターはカンマで区切り、一番最後のパラメーターの後にピリオドを送信します。

この場合、垂直タブはチャンネル2のみが指定できます。

FSシーケンス

10CPIにする
FS B (1C 42)
全角文字を32ドットピッチにします。この制御コードをあらかじめ送出しておく事で、半角のドットピッチはそのままで、全角を32ドットピッチで印刷する事ができます。BASICやMS-DOSのほとんどのアプリはこの方法で半角:全角を1:2にしていました。ただ、この場合は全角の文字間が少し広すぎる感じがします。



10CPIは半角で10CPIです。全角だと1インチあたり5文字になります。

13.3CPIにする
FS A(1C 41)
全角文字を24ドットピッチにします。

ドットプリンターでストックフォーム連続用紙でガーガー印刷していた頃は、10CPIでも特に文句は言われなかったのですが、そのうちプリンターが安価になり性能がアップするにつれ、インクジェットやレーザープリンター等の高品位な文字でA4単票用紙に印刷するようになってきました。そうなってくると、粗いドットで印刷していた頃には気にならなかった全角文字の文字幅が気になりだしました。「もっと文字間をつめれば文字数入るはずだ」「文字間をもっとつめてくれ」と要求される事が多くなりました。

現在はWindowsのアプリで、印刷位置(水平位置)は絶対位置で指定するのでプロポーショナルでも問題ないのですが、当時は当時の技術でなんとかして半角の文字間をつめる必要があったのです。 そこで、PC-PR201プリンタに内蔵されている「半角漢字フォント」というものを使う方法が考えられました。

半角漢字フォントを使うためには、通常の全角文字と同じように「漢字オン」のコードを送信した後、<00>に続いて半角の文字コードを送信し、「漢字オフ」を送信します。ここで、あらかじめ<1C>Aを送出して、全角のドットピッチは24ドットにしておきます。



ただし、この方法では半角1文字ごとに、前に「漢字オン」<00>、後ろに「漢字オフ」をつける必要があるため、通常のアプリ層でこれを行うのは大変困難です。そこで、当サイトで掲載しているNPRINTER.SYSでは、組み込む際に/C=13.3を指定する事で、自動的に半角文字を印刷する際に「漢字オン」<00>と、「漢字オフ」を付加してくれるようになります。

12CPIにする1
FS C(1C 43)

15CPIにする
FS D(1C 44)

20CPIにする
FS F(1C 46)

12CPIにする2
FS G(1C 47)

いずれも半角の文字数でのCPIです。全角文字はこの半分になります。

漢字文字幅の設定
FS p(1C 70)
1C 70に続いて、2,分子/分母.と設定します。といっても任意の値が設定できるわけではなく、1/5、1/6、3/20、2/15、1/10のみが設定できます。

例)
FS p 2,1/5. ・・・ 1/5インチ
FS p 2,1/6. ・・・ 1/6インチ
FS p 2,3/20. ・・・ 3/20インチ
FS p 2,2/15. ・・・ 2/15インチ
FS p 2,1/10. ・・・ 1/10インチ

漢字文字サイズの変更
FS 04S(1C 30 34 53)
漢字の文字サイズを変更します。といっても、任意の値が指定できるわけではなく、以下からの選択になります。FS 04Sに続いて3桁のテキストで指定します。
FS 04S 120 ・・・ 12ポイント
FS 04S 105 ・・・ 10.5ポイント
FS 04S 095 ・・・ 9.5ポイント
FS 04S 070 ・・・ 7ポイント

ラインの太さ指定
FS 04L (1C 30 34 4C)
アンダーラインまたはオーバーラインの太さを指定します。FS 04Lに続いて、S12もしくはS14をテキストで指定します。
S12 ・・・ 細線
S14 ・・・ 中線
ここで設定したラインは、ESC Xを受信すると引かれます。

拡張コマンド

PR201に 後から <いつ?> 追加されたコマンドです。したがって、 後から <いつ?> 作られた機種でしか使う事ができず、特にEPSONのプリンターのPC PR201エミュレーション(ESC PS)では通用しない場合があります。

中には一太郎dash等、必要もないのにESC w0,0. コマンドを送出するもあり、その場合ESC PSプリンターに送信すると、w0,0.というふうにパラメーターだけ印字してしまいます。そこで、当サイトで掲載しているNPRINTER.SYSでは、組み込む際に /Pを指定する事により、拡張コマンドの部分だけプリンターに送らずに止める(捨てる)事ができます。(これを、ESC PSモードと呼びます)

文字修飾
FS c パラメーター(1C 63 パラメーター)
1C 63に続いてパラメーターを1桁のテキストで指定します。
0 ・・・ 解除
1 ・・・ ボールド
2 ・・・ イタリック
3 ・・・ アウトライン
4 ・・・ シャドゥ
5 ・・・ 立体

文字間スペース
FS w 左ドットスペース,右ドットスペース. (1C 77 左ドットスペース 2C 右ドットスペース 2E)
1C 70に続いて左右の文字間を指定します。左ドットスペース、右ドットスペースはテキストで指定し、左ドットスペース カンマ 右ドットスペース ピリオドという順番で指定します。

例えば手書きの指定伝票で、1桁ごとに枠が決まっている場所に数字を印刷する場合等に使います。

どうでもいいけど、他のコマンドは001とか002みたいに桁固定で頭に0を入れる方式なのに、なぜこのコマンドだけ桁が固定ではなく、カンマとピリオド区切りなのでしょう?ドットスペースなんで最高でも2桁しかないんだから2桁固定でいいんじゃないかと。

その他のコマンド

n行改行
1F 改行幅
VFUで設定した垂直タブへの移動に、
1F 02 が送信されればタブ2
1F 03 が送信されればタブ3
1F 04 が送信されればタブ4
1F 05 が送信されればタブ5
1F 06 が送信されればタブ6
というのがありますが、1Fに続いて10H以上の値が指定された場合は、n行改行になります。改行幅は、改行させたい量+10Hです。最大値は58Hですので、このコマンドによって最上位ビットが立つ事はなく、シフトJISコードの1バイト目とバッティングする心配はありません。

SELECT
11H
プリンターを「オンライン」にします。

DESELECE
13H
プリンターを「オフライン」にします。

拡大印字
0E
文字を縦横それぞれ倍角で印刷します。レーザープリンターのPR201エミュレーションとかでは綺麗に拡大されますが、通常ドットプリンタで倍角印刷してもドットが粗くなるだけであまり綺麗には印刷されません。

拡大印字解除
0F
デュップスイッチの設定によって7ビットモードになっている場合は、0Eはカナオン、OFはカナオフ(英数モード)という意味になります。この場合、拡大印字は12H、拡大印字解除は14Hになります。

このページの先頭へ
  広告