Home > 2月 5th, 2015

2015.02.05

T98-Nextでの印刷 on Windows 8.1

うちの会社で昔作ったPC-98用ソフトをT98-Next上で動かして何度か目にしたのが「印刷途中で急に途切れて、次ページから制御コードを印刷したようなページがぞろぞろ何ページも出てくる」という現象。
Windows XPでは出なくて、Windows 7では時々という状態だったのが、Windows 8.1になると特定箇所で必ず発生するように。それもドットインパクトプリンタでは発生せず、レーザープリンタでのみ。

何度も調べた結果
1.プリンタプラグイン(PRINTER.NHW)で何かがトリガーになって印刷ジョブが途中で完了してしまう ←ここで用紙が排出される(=途切れる)
2.でもT98-Next上のソフトは印刷完了してないので引き続きLPTに出力される
3.するとWindows上のプリンタでは新たな印刷ジョブとして認識される
4.印刷ジョブの最初で設定した用紙サイズやフォント、改行幅などのESCコマンドによる書式はジョブが変わると引き継がれず、次ページからデフォルト書式でデータが続々と印刷される ←これが制御コードのように見える

ドットインパクトプリンタだと印刷ジョブが切れても勝手に用紙排出とかされず、書式を引き継いだまま印刷される(まあ垂れ流しみたいなもんだし)ので気がつかないんだが、レーザープリンタの場合はジョブが完了すると用紙が強制排出されて書式もリセットされるのでどうしようもない。

ちゃんと対応するにはNDDKでプリンタプラグインを自前で作るのがベストなんだけど、何せPC-98関係の資料がもう手元に無いんで開発もできず。(UNDOCUMENTED 9801/9821 Vol.1が残ってりゃなあ…)

なので苦肉の策として
1.RedMon - Redirection Port Monitorをインストール。
2.プリンタドライバとして「Generic / Text Only」を使う。
3.Redmonによって標準入出力から送られる印刷生データをファイル出力するプログラムを書く(言語は何でもOK)。
4.「デバイスとプリンタフォルダ」の「プリントサーバのプロパティ」で「Redirected Port」を追加。「Generic / Text Only」に割り当てる。
5.3.のプログラムで出力された分割ファイルを結合。目的のプリンタに出力。
という、なんとも泥臭い方法で回避することに。
ちなみに印刷の完了はどうやっても判断できなかったんで、一定時間ファイルが出力されなかったら完了と見なすというこちらも大変アナログな方法しか考えつきませんでした(--;

T98-NEXT & T98vmm 関連のページのprtdp.nhwとか使えば良かったんだけど、スプール中のまま印刷されない事についてのCLOSESPLを使うよう98側のプログラムを直さなきゃいけないのが結構しんどかったのでこういう形に。

本家で直してもらえたら嬉しいけど難しいだろうなあ。