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

プリンター

プリンター出力時の注意

PC-9801のプリンターポートは、前期の機種(PC-9801VMからPC-9801FELLOWの初代BA/BXまで、PC-9821MATEの初代Ae/As/Ap/Afまで)と、後期(PC-9801FELLOWのBA2/BX2からBX4まで、PC-9821MATEのAe2/As2、Xa7/Xa9/Xa10から終焉まで)で大きな変更がありました。

前期の機種では、プリンターポートは14ピンで出力専用、詳細なステータスが判別できませんでした。後期の機種から36ピンフル接続となり、双方向で詳細なステータスが取得できるようになりました。

そのため、プリンターのステータスを取得するためには、まずプリンターポートがフル規格か簡易規格かを判別しなければなりません。これはROMアドレス 0000:0458Hで判別します。2ならフルセントロ、それ以外なら簡易セントロです。

PRINT.SYSの組み込み

プリンター関係のBIOSを使うためには、PRINT.SYSが必要です。CONFIG.SYSに、
DEVICEHIGH=A:\DOS\PRINT.SYS /U
のように記述してプリンターBIOSを組み込んでください。

/Uの意味は忘れてしまいました。

プリンターBUSYのチェック

プリンターのBUSY信号を取得する際は、プリンターBIOS(INT 1AH)を使います。

AH=12Hプリンターのステータスチェック
出力 AH:ステータス
意味
00H Ready
01H Busy
02H Timeout
03H Offline
04H Paper end
05H Not connect

AH=0ならレディといいたいところですが、簡易セントロニクスの場合はAH=1(Busy)が返ってきます。簡易セントロではRedyでもBusyでも1になり、オフラインや未接続の場合に0になります。つまり、ReadyかBusyの区別はできないけど、ステータス1なら少なくとも接続はされているという事です。

「BusyまたはReady」であれば、少なくともPC側は「プリンターの準備ができてません」というエラーを出さずとも特にクレームにはなりませんでした。というのも、Busyでも大抵のプリンターはバッファにたまりましたので。

しかし、他社のアプリでは、I/Oポートに無動作の信号を送信して反応を見てBusyかReadyかを判別しているものがあり、中には「他者のソフトはできるのになんでおたくはできないんだ!」みたいな事を言う人もいました。幸い、すぐにフルセントロニクスの機種が広まったため、なんとか事なきを得ましたが。その場合、判別できないのは、プリンターポートのピンの数が少ないからだいう事で、フルセントロの機種への買い替えを勧めました。
コラム 裏ワザを使わない事はバグなのか!?

プログラミングで一番困るのは、正当な手段ではできない事が、裏ワザ的な事をするとできてしまう場合です。この場合、これまで「ハードの制約上不可能」で通っていた事が、世界のどこかで誰かがそれを実現する方法を発見してしまうと、これまで作っていた物が全てバグとか不具合として扱われる事があります。(これを裏ワザの悲劇と呼びます)

今もWebアプリでブラウザに対して裏ワザを使うと今までできなかった事ができる方法が発見されると、それまでその方法を使ってないソフトは全てバグとして扱われてしまうという悲しい状態になります。たとえば、PHPで巨大ファイルをアップロードするサイトを作っていて、どこかのサイトでアップロードの進捗率をAjaxを使ってリアルで表示させるサイトができると、今まで作っていたアップロードの進捗状況が表示されないサイトを「アップロードの進捗状況が表示されない不具合」と呼ばれたりします。当然、修正はタダでやらされます。

これからは、ソフトの契約時に「世界のどこかで誰がやろうが、基本ソフト(OS、言語、API) にない事はやらない」っていう取り決めが必要でしょうね。アセンブラで作ってた頃と違って、今のソフト開発は基本ソフトにかなり依存しますので。
AH=18Hフルセントロニクスのプリンターのステータスチェック
出力 AH:ステータス(AH=12Hと同じ)

フルセントロニクスの場合、AH=18Hをセットする事で、詳細なステータスを把握する事ができます。フルセントロニクス搭載機種なのにBusyとReadyが判別できないと「ハードの制約のせいです」という弁解がきかないので、ちゃんとフルセントロニクスに対応して作りましょう。
;----------------プリンターチェック------------------
;----------セントロニクの種類をチェック
		PUSH	ES
		MOV	AX,0
		MOV	ES,AX
		MOV	AL,ES:[0458H]
		POP	ES
		CMP	AL,2
		JZ	FULLCENTRO

;----------簡易セントロニクス
KANNICENTRO	=	$
		MOV	AH,12H
		INT	1AH
		CMP	AH,1
		JE	READY
		JMP	HC6

;---------フルセントロニクスの機種の場合
FULLCENTRO		=	$
		MOV	AH,18H
		INT	1AH
		CMP	AH,0
		JE	READY

;		JMP	HC6
;プリンターレディ
READY		=	$

データーの出力

データーの出力は簡単です。AHレジスタに11H、ALレジスタに出力データーを入れて 1AH割り込みをかけるだけです。

AH=11H プリンターにデーター出力
出力
 AL:出力データー
入力
 なし
;---------------改行コードを出力
		MOV	AH,11H
		MOV	DX,0
		MOV	AL,0DH
		INT	1AH
		MOV	AH,11H
		MOV	DX,0
		MOV	AL,0AH
		INT	1AH
DXレジスターに0をセットしている理由は何かあったような気がするんですが忘れました。当時の資料も紛失してしまいましたし・・・。

プリンターBIOSは、出力専用の簡易セントロ互換性をもたせるためか、データー出力してエラーでも何もステータスは返って来ません。エラーかどうかは、別途定期的にAH=18Hでステータスをチェックする必要があります。

また、簡易セントロのときは特に印刷が始まってからのエラーを調べる術がありません。PC-9801用のアプリの多くが、印刷中に紙がジャムっても画面はそのまま印刷中になっているのはそのためです。やっぱり東芝の販促資料に書いてあった通り、PC-9801はアンタッチャブルなのかもしれません。

AH=30H 複数バイト出力
ES:BX 出力データー
CX バイト数
;---------------改行コードを出力
                MOV     AH,30H
                MOV     AL,0
                MOV     BX,OFFSET KAIGYO
                MOV     CX,2
                MOV     DX,0
                INT     1AH

        (省略)

KAIGYO          DB      0DH,0AH
AL DXレジスターに0をセットしている理由は何かあったような気がするんですが忘れました。

参考文献
『PC‐9801スーパーテクニック』 1992年 小高輝真、清水和文、速水祐 著 アスキー
『J-3100解析ハンドブック』 1989年 土屋勝著 ナツメ社
『DOS/Vテクニカル・リファレンス・マニュアル』 1993年 芦達剛著 ソフトバンク
スポンサーリンク