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

FMPR-201系制御コード

FMPR-201

富士通のカラー熱転写プリンターです。富士通FM-7シリーズ用のプリンターとして使われてきました。現在でもFM-R用のプリンターとして業務で使われているプリンターには、同様のFMPR-201系の制御コードを受け付ける(エミュレーションですが)ものもあります。

後継機としてFMPR-202/203/204があり、同様にFM系の制御コードを使うことができます。

ESCシーケンス

以下はESCシーケンスの中でもパラメーターを必要としないものです。

漢字オン
ESC $ @ (1B 24 40) JIS-78モード
ESC $ B (1B 24 42) JIS-83モード
全角モードにします。JIS-78は主にPC9801で使われている体系で、一部記号(①や♪など)や、一部の文字(桧や篭)の文字に相違があります。通常、PC9801で使わない限りはJIS-83を指定します。

いずれにしてもJISコードで送信しなければなりませんので、元データーが普段F-BASICやMS-DOSやWindowsで使われているシフトJISやEUCコードだった場合は、JISコードに変換しなければなりません。

当サイトで掲載しているプリンタードライバー(FMPRT.SYS)では、シフトJISコードで送信されたテキストを印刷する際に、全角文字の手前で ESC $ B を送信し、続いてJISコード ESC ) Hを送信しています。

;------------- 漢字ON + JISコード + 漢字OFF
		MOV	AL,01BH
		STOSB
		MOV	AL,"$"
		STOSB
		MOV	AL,"B"
		STOSB
		MOV	AL,CS:[KANJI_1]
		STOSB
		MOV	AL,CS:[KANJI_2]
		STOSB
		MOV	AL,1BH
		STOSB
		MOV	AL,"("
		STOSB
		MOV	AL,"H"
		STOSB
		POP	DI
		POP	ES
		RET

漢字オフ
ESC ( H (1B 28 48)
全角モードをオフにして、半角モードに戻します。

改行
ESC E (1B 45)
改行します。CR LF(0D 0A)と同じです。

水平タブ
ESC H (1B 48)
現在のヘッドの位置を水平タブに設定します。最大16個まで設定できます。

垂直タブ
ESC J (1B 4A)
現在のヘッドの位置垂直タブに設定します。最大16個まで設定できます。

リセット
ESC c(1B 63)
プリンターを初期状態にします。外字はクリアされません。

ESC [ シーケンス

ESC [に続いてパラメーター、区切りの文字で指定します。区切りの文字によって動作が異なります。パラメーターはテキスト(30H~39H つまり普通にテキスト文字で0~9)で指定します。

絶対位置指定
ESC [ パラメーター ` (1B 5B パラメーター 60)
ヘッドを左端からの絶対位置に移動します。n/180インチで指定します。

相対位置指定
ESC [ パラメーター a (1B 5B パラメーター 61)
ヘッドを現在位置から指定された量だけ右に移動させます。n/180インチで指定します。

絶対垂直位置指定
ESC [ パラメーター d (1B 5B パラメーター 64)
用紙の位置を上からの絶対位置まで送ります。n/180インチで指定します。

相対垂直位置指定
ESC [ パタメーター e (1B 5B パラメーター 65)
用紙の位置を現在位置から指定量だけ下に送ります。n/180インチで指定します。

行カラム絶対位置指定
ESC [ 行 ; カラム f (1B 5B 行 3B カラム 66)
用紙を指定行、ヘッドを指定カラムまで移動させます。n/180インチで指定します。

タブクリア
ESC [ パラメーター g (1B 5B パラメーター 67)
コーラの前を横切る奴(それはSASUKE)・・・ではなく、透明なコーラでもなく、以前に設定されたタブをクリアします。

パラメーターは以下から選択します。
 ・0 現在のヘッドの位置の水平タブをクリアします。
 ・1 現在の用紙の位置の垂直タブをクリアします。
 ・3 全ての水平タブをクリアします。
 ・4 全ての垂直タブをクリアします。

水平逆タブ
ESC [ パラメーター j (1B 5B パラメーター 6A)
ヘッドを現在位置から指定量だけ左に移動させます。n/180インチで指定します。

垂直逆タブ
ESC [ パラメーター k (1B 5B パラメーター 6B)
用紙を指定量だけ上に戻します。n/180インチで指定します。

ANKアンダーラインまたはカラー指定
ESC [ パラメーター m (1B 5B パラメーター 6D)
ANK文字をアンダーラインにする、もしくはリボンの色を指定します。

パラメーターは以下から選択します。
 ・0 通常
 ・4 ANKアンダーライン
 ・30 リボンをKにします。
 ・33 リボンをYにします。
 ・35 リボンをMにします。
 ・36 リボンをCにします。

モノクロのリボンがセットされている場合は、色指定は無視されます。リボンの色が指定された場合は、指定された色までリボンが空送りされ、空送りされてしまったリボンはもう再利用も巻き戻しもできません。つまり、非常にもったいないです。(だからどうした??)

ANK倍角指定
ESC [ 縦倍率;横倍率 スペース B(1B 5B 縦倍率 3B 横倍率 20 42)
ANKの倍率を指定します。しかし、縦倍率は100しか指定できません。(じゃあ横倍率だけで良いのでは?)横倍率は100か200を指定します。200が指定されると横2倍になります。

プロポーショナルピッチのスペース量指定
ESC [ パラメーター スペース E (1B 5B パラメーター 20 45)
プロポーショナルピッチで印刷した場合の、空白(20H)の量を指定します。n/180で指定します。

ANKの文字ピッチと改行量指定
ESC [ 改行量; 文字ピッチ スペース G(1B 5B 改行量 3B 文字ピッチ 20 47)
改行量、文字ピッチともにn/180インチで指定します。初期状態では、改行量は30、文字ピッチは18です。また、東芝やNECのシーケンスと違い、標準よりも狭くできます。(最小10ピッチ) 14ピッチ以下にすると縮小文字が印刷されます。

水平タブ指定
ESC [ タブ位置; ・・・ タブ位置 スペース N (1B 5B タブ位置 3B ・・・ タブ位置 20 4E)
水平タブ位置を設定します。タブ位置は最大16個まで ;で区切ります。一番最後にスペースNを送信します。タブ位置はn/180インチで指定します。

ESC Q シーケンス

ESC Qに続いてパラメーター、区切りの文字で指定します。区切りの文字によって動作が異なります。パラメーターはテキスト(30H~39H つまり普通にテキスト文字で0~9)で指定します。

垂直タブ設定
ESC Q パラメーター; ・・・ スペース @ (1B 51 パラメーター 3B ・・・ 20 40)
垂直タブを設定します。16個まで設定できます。パラメーターは;で区切り、最後はスペース@を送信します。単位はn/180インチです。また、後のパラメーターの方が大きい値でなければなりません。

ページ長指定
ESC Q パラメーター スペース A(1B 51 パラメーター 20 41)
ページ長を指定します。単位は「行」です。現在の改行量にしたがってページ長が設定されます。

ページ長指定2
ESC Q パラメーター スペース B(1B 51 パラメーター 20 42)
インチ単位でページ長を設定します。単位はインチです。なので、あまり細かい設定はできません。(1インチは25.4ミリ)

改行ピッチ指定2
ESC Q 分子; 分母 スペース G (1B 51 分子 3B 分母 20 47)
改行ピッチを、分子/分母インチに設定します。1/180インチよりも細かい指定はできません。

自動改ページ指定
ESC Q パラメーター スペース K (1B 51 パラメーター 20 4B)
指定した行まで改行すると自動的に改ページします。

水平位置絶対指定
ESC Q パラメーター スペース P(1B 51 パラメーター 20 50)
ヘッドの位置を左端からn/180インチの場所に移動させます。

左端位置指定
ESC Q 仮想文字ピッチ; 文字数 スペース Q(1B 51 仮想文字ピッチ 3B 文字数 20 51)
左端の位置を、仮想文字ピッチ x 文字数の位置に設定します。

イメージ印刷
ESC Q 列数 W データー ・・・ 倍密度等幅
ESC Q 列数 V データー ・・・ 単密度倍幅
ESC Q 列数 X データー ・・・ 倍密度倍幅

列数はキャラクターコードで指定しますので、バイナリデーターはWやVやXの後に来ます。データーは1列3バイトですので、バイナリデーターは列数×3 のデーター量になります。

倍密度等倍
14
25
36

単密度倍幅
1 4
2 5
3 6

倍密度倍幅
1144
2255
3366

のように印刷されます。通常は倍密度等倍(W)を使います。

データーの作成方法
1列分のデーターを作成する際に、上位ビットが上なのでドットを上から下へキャリーフラグを含んで左シフトしながら3バイト分ローテーションさせて作成します。

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

できあがった1列分データーを必要な列分作成して、プリンターに送信します。

当サイトに掲載しているプリンタードライバー(FMPRT.SYS)では、このバイナリバイト数分だけ透過モードとなり、シフトJIS→JISコードへの変換を行わなくなります。

;-------- ESC Q イメージ転送
CHK2            =       $
                CMP     CS:[KAKO3],BYTE PTR 1BH
                JNE     CHK3
                CMP     CS:[KAKO2],BYTE PTR "Q"
                JNE     CHK3
                JMP     TOUKA_MODE_IN2

              (省略)

TOUKA_MODE_IN2  =       $
                MOV     CS:[TOUKA_F],BYTE PTR 2
                MOV     CS:[KAKO1],BYTE PTR 0
                MOV     CS:[KAKO2],BYTE PTR 0
                MOV     CS:[KAKO3],BYTE PTR 0
                MOV     CS:[KAKO4],BYTE PTR 0
                MOV     CS:[KAKO5],BYTE PTR 0
                MOV     CS:[KAKO6],BYTE PTR 0
                MOV     CS:[HK1],BYTE PTR "0"
                MOV     CS:[HK2],BYTE PTR "0"
                MOV     CS:[HK3],BYTE PTR "0"
                MOV     CS:[HK4],AL
                JMP     ORG_INT17H

TOUKA_MODE2     =       $
                CMP     AL," "
                JE      TOU2_2

                PUSH    AX
                MOV     AL,CS:[HK2]
                MOV     CS:[HK1],AL
                MOV     AL,CS:[HK3]
                MOV     CS:[HK2],AL
                MOV     AL,CS:[HK4]
                MOV     CS:[HK3],AL
                POP     AX
                MOV     CS:[HK4],AL
                JMP     ORG_INT17H

TOU2_2          =       $
                MOV     CS:[TOUKA_F],BYTE PTR 3
                JMP     ORG_INT17H

              (省略)

TOUKA_MODE3     =       $
                CMP     AL,"V"
                JE      TOU3
                CMP     AL,"W"
                JE      TOU3
                CMP     AL,"X"
                JE      TOU3
                MOV     CS:[TOUKA_F],BYTE PTR 0
                JMP     ORG_INT17H

TOU3            =       $
                PUSH    AX
                CALL    HENKAN
                MOV     AX,[HK5]
                MOV     BX,3
                MUL     BX
                ADD     AX,1
                MOV     CS:[TOUKA_P],AX
                POP     AX
                JMP     TOUKA_MODE_IN

ハードコピードライバー(GRAPHFM.COM)では、<1B>Q1280 Wに続いて、1280列分のデーターを送信しています。

HARDC           =       $
                MOV     [GX],WORD PTR 0
                MOV     [GY],WORD PTR 0

                MOV     [CNT1],WORD PTR 12
                MOV     [CNT2],WORD PTR 640
                MOV     AX,[KAISUU]
                MOV     [CNT3],AX

HC0             =       $
                MOV     BX,OFFSET ESCQ
                MOV     CX,8
                CALL    INSATU
                  :
                  :
                  :
               (省略)

ESCQ            DB      1BH
                DB      "Q1280 W"

カットシートフィーダー制御
ESC Q パラメーター スペース [ (1B 51 パラメーター 20 5B)
カットシートフィーダーに対するコマンドです。パラメーターには以下が指定できます。
0 用紙吸入
1 用紙排出
10 普通紙指定
11 はがき縦方向指定
12 はがき横方向指定

シードフィーダー使用中は、逆改行ができません。

漢字縦倍角基準指定
ESC Q パラメーター スペース d(1B 51 パラメーター 20 64)
漢字を縦倍角で印刷する時に、他の文字との位置関係を指定します。
0 上合わせ
1 下合わせ
2 中心合わせ
下合わせ、中心合わせはCEXシーケンスにも同じものがありますが、上合わせはこのシーケンスでなければできません。詳しくはCEX - tシーケンスの説明を御覧ください。

半角文字縦書き指定
ESC Q パラメーター スペース p(1B 51 パラメーター 20 70)
縦書きモード時に、半角文字をどう印字するかを指定します。
0 2文字ずつセットで印字します。
1 1文字ずつ印刷します。

罫線接続
ESC Q パタメーター スペース t (1B 51 パラメーター 20 74)
全角の罫線のキャラクターの上下左右にスペースを入れるか入れないかを指定します。通常は、全角の罫線のキャラの上下左右にはスペースが入るため、罫線の接続はされません。
0 接続しない
1 接続する

未定義文字印字指定
ESC Q パラメーター スペース x (1B 51 パラメーター 20 78)
未定義文字を受信した場合に、何を印字するかを指定します。
0 豆腐
1 全角スペース

半角漢字指定
ESC Q パラメーター スペース l (1B 51 パラメーター 20 7C)
半角漢字が指定されると、以後は半角文字が半角漢字になります。半角漢字は漢字の半分のピッチで印字されるため、漢字:ANKを2:1で印刷するのに便利です。
0 解除
1 半角漢字印字

高速印字
ESC Q パラメーター スペース  ̄ (1B 51 パラメーター 20 7E)
注:上棒( ̄)は実際には半角です。シフトJISにすると半角上棒が出ないので、全角で表記しています。
高速印字を指定します。といっても、熱転写プリンターではたいして変わらなかったと思います。
0 通常印字
1 高速印字

CEXシーケンス

CEXシーケンスは1CHから始まるシーケンスです。

CEXシーケンスのパラーメーター
富士通のプリンターでは引数に特殊な形式を使います。引数はバイナリで指定しますが、上位4ビットは2もしくは6もしくは7に固定されており、実際の値は下位4ビットで指定します。

・引数が1個で1と指定する場合
71
・引数が1個で100と指定する場合、
21 20 70
・引数が2個で、100、100と指定する場合、
21 20 60 21 20 70

このように、上位4ビットの2は「まだ桁の途中」を意味し、上位4ビットの6や7は「これが最後の桁」を意味します。また、上位4ビットの6は「まだ引数の途中」を意味し、上位4ビットの7は「これが最後の引数」を意味します。

これによって、区切りの記号(; , : など)を必要とせず、またシフトJISコードの全角の第1バイトとかぶる心配もないので、プリンタードライバーを作る側としては楽です。しかし、引数のセットはいささか苦労します。

スペース
CEX ! (1C 21)
指定された数だけスペースを空けます。1C 21 に続いてCEXシーケンスのパラメーターで指定します。

絶対位置指定
CEX " (1C 22)
ヘッドを指定されたカラム、行に移動します。CEXシーケンスのパラメーターで指定します。つまり、上位4ビットの2は「まだ桁の途中」、6は「桁の終わり」7は「桁とパラメーターの終わり」です。

例)
・1行1カラムに移動
1C 22 61 71
・10行10カラムに移動
1C 22 21 60 21 70
・100行100カラムに移動
1C 22 21 20 60 21 20 70

水平タブ設定
CEX # (1C 23)
水平タブ位置を指定します。最大16個まで指定できます。
今までの水平タブは削除されます。

パラメーターは、CEXシーケンスのパラメーターで指定します。つまり、上位4ビットの2は「まだ桁の途中」、6は「桁の終わり」7は「桁とパラメーターの終わり」です。

例)
・1カラム目だけ
1C 23 71
・1カラム、10カラム目
1C 23 61 21 70

全角文字間ピッチの指定
CEX $ (1C 24)
全角の文字間ピッチを指定します。初期値は27で、それ以下にはできません。パラメーターは、CEXシーケンスのパラメーターで指定します。つまり、(以下略)

例)
・27ドットピッチにする
1C 23 22 77
・36ドットピッチにする
1C 23 23 76

行間ピッチ指定
CEX % (1C 25)
先に述べたESC Qでも似たような指定ができますが、こちらはn/180インチで指定できます。1~60まで指定できます。パラメーターは、CEXシーケンスのパラメーターで指定します。

拡大印字
CEX ' (1C 27)
全角文字を拡大印刷します。といっても、任意の倍率が設定できるわけではなく、100(等倍)200(2倍)のいずれかのみの指定になります。CEX ' に続いて、縦倍率、横倍率の順に指定します。パラメーターは、CEXシーケンスのパラメーターで指定します。

漢字アンダーライン、リボンの色指定
CEX * (1C 2A)
全角文字のアンダーライン、もしくはリボンの色を指定します。ANKのアンダーラインは別のコマンド(ESC [ )で指定するので、ANKには影響しません。CEX * に続いてパラメーターを指定します。パラメーターは、CEXシーケンスのパラメーターで指定します。

0 通常
4 漢字アンダーライン
10 リボンの色をKにする。
13 リボンの色をYにする。
15 リボンの色をMにする。
16 リボンの色をCにする。

パラメーターの書式はCEX形式ですので、実際にイエロー(13)を指定するのであれば、16進数で 21 73です。つまり、キャラクターコードでは「!s」となります。このように、CEX形式ではテキストキャラクターに変換できるので、わかってしまえば扱いやすいと言えるでしょう。

リボンの色が指定されると、プリンターは指定された色の先頭までリボンを空送りします。ちなみに、FM-PR201のリボンは巻き戻しや再利用ができないため、空送りされたリボンはそのまま使われる事なく廃棄される事になります。

で、しかもリボンは1本1000円近くするため、正直言ってFM-PR201でカラー印刷をするためには「お金の成る木」と、「大量のカラーリボン」を必要とするでしょう。まあ、はっきり言って熱転写プリンターでカラー印刷はしない方がよろしいかと。

なお、モノクロリボンをセットした状態でリボンの色を指定しても無視されます。

;黄色
YELLOW		=	$
		MOV	BX,OFFSET SET_YELLOW
		MOV	CX,4
		CALL	INSATU

               (省略)

SET_YELLOW	DB	1CH,"*!s"
SET_MAGEBTA	DB	1CH,"*!u"
SET_CYAN	DB	1CH,"*!v"
SET_BLACK	DB	1CH,"*!p"

中心合わせ
CEX - t (1C 2D 74)
縦倍角と縦等倍角の文字が1行で混在した時に、標準の文字が中心に合わされます。



下合わせ
CEX . t (1C 2E 74)
縦倍角と縦等倍角の文字が1行で混在した時に、標準の文字が下に合わされます。



改行
CEX @(1C 40)
改行します。CR LF(0D 0A)と同じです。

字下げ付き改行
CEX C (1C 43)
改行した後、ヘッドの位置を2文字目にします。

水平逆タブ
CEX D (1C 44)
ヘッドの位置を前のタブ位置まで戻します。

垂直逆タブ
CEX E (1C 45)
用紙の位置を前の垂直タブ位置まで戻します。

タブセット
CEX F (1C 46)
現在のヘッドの位置を水平タブとして記憶します。16個まで記憶できます。

タブリセット
CEX G(1C 47)
現在のヘッドの位置がタブ位置として記憶されていたら削除します。

垂直タブセット
CEX H(1C 48)
現在の用紙の位置を垂直タブとして記憶します。16個まで記憶できます。

垂直タブリセット
CEX I (1C 49)
現在の用紙の位置が垂直タブとして記憶されていたら削除します。

縦書き漢字
CEX J(1C 4A)
以後、全角文字は縦書きになります。

縦書き漢字解除
CEX K(1C 4B)
全角文字の縦書きが解除されます。

上つき文字指定
CEX N(1C 4E)
上つき文字指定解除
CEX O(1C 4F)
下つき文字指定
CEX P(1C 50)
下つき文字指定解除
CEX Q(1C 51)



プロポーショナルピッチ
CEX T (1C 54)
半角文字がプロポーショナルピッチで印刷されます。Windowsみたいに全角文字がプロポーショナルピッチになったりはしません。

プロポーショナルピッチ解除
CEX U (1C 55)

リセット
CEX ] (1C 5D)
プリンターを初期状態にします。

外字登録
CEX スペース 文字コード 外字データー・・・
文字コードには、外字として登録するコードを2バイトのJISコードで指定します。FM-PR201では外字エリアは2821~287E、2921~297Eです。

アセンブラで作る場合注意しなければならないのは、インテル系では2バイトコードをリトルエンディアンで扱いますが、このプリンタでは2バイトコードをビッグエンディアンで扱うので、

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

のように計算用メモリーからプリンター送信用メモリーに転送する際に、XCHGコマンドを使って上位/下位バイトを逆転させる必要があります。FMのパソコンは当初モトローラー系のCPUを使っていたので、プリンターのコマンドもビッグエンディアンなのでしょう。(・・・って、関係ない?)

外字データーはNECやESC/Pとは違い、画面用と同じように1バイトが横1スライスを表します。また、FMは外字登録でバイナリデーターが送信されないため、シフトJISコードの2バイトコードと重なるデーターが送信される可能性がありません。したがって、外字登録コマンドではプリンタードライバーの方で透過処理をする必要がありません。しかし、その分1バイトで送信できる情報が下位4ビットに限定されるため、低速になります。


データーの上位4ビットは0011で固定となるため、16進数で3xとなります。このxの部分4ビットで外字データーを送信します。

;====================================================================
;      画面用フォント  →  プリント用フォント
;====================================================================
P_HENKAN        =       $

;---------16進数→富士通形式
                MOV     SI,OFFSET KANPAT
                MOV     DI,OFFSET PRPAT
                MOV     CX,72

FUJIHEN1        =       $
                MOV     AL,[SI]
                AND     AL,11110000B
                SHR     AL,1
                SHR     AL,1
                SHR     AL,1
                SHR     AL,1
                OR      AL,00110000B
                MOV     [DI],AL

                MOV     AL,[SI]
                AND     AL,00001111B
                OR      AL,00110000B
                MOV     [DI+1],AL

                ADD     SI,1
                ADD     DI,2
                LOOP    FUJIHEN1

                RET

段組み指定

最初に段組みを設定しておき、改行時に「改行1」や「改行2」コマンドを送信する事によって、改行後どこにヘッドを持っていくか指定する事ができます。

段組み設定
CEX ) (1C 29)
1C 29に続いて、
 ・P1 仮想文字のドットピッチ(n/180)
 ・P2 右端までの仮想文字の個数
 ・P3 左端1までの仮想文字の個数
 ・P4 左端2までの仮想文字の個数
を指定します。

P1 P2 P3 P4はCEXシーケンスのパラメーターで指定します。つまり、上位4ビットの2は「まだ桁の途中」を意味し、上位4ビットの6は「桁の終わり、まだパラメーターは続く」を意味し、上位4ビットの7は「桁もパラメーターも終わり」を意味します。

例)
P1=100、P2=100、P3=100、P4=100と指定する場合




改行1
CEX A (1C 41)
改行して、ヘッドを左端1に指定します。左端1は事前に段組み指定で定義しておきます。

改行2
CEX B(1C 42)
改行して、ヘッドを左端2に指定します。左端1は事前に段組み指定で定義しておきます。

このページの先頭へ
  広告