﻿========================================================================

  XM7 for Java
  FM-7 EMULATOR XM7 for Java
  V1.1 L01 (2013/01/12)

  Copyright (C) 1999-2012 ＰＩ．(ytanaka@ipc-tokai.or.jp)
  Copyright (C) 2001-2012 Ryu Takegami
  ROMEO support code by usalin
  JAVA support code by GIMONS
  line printer support & part of Java support 2010-2013 by Ben.JP
  http://motor.geocities.jp/a160_1930/FM-7/XM7_for_Java/

========================================================================

0. 使用規定、免責事項、著作権：

  ・XM7 for Java はフリーソフトです。
　  本ソースコードを利用して生じたあるいは生じると予測される損害について、
　  私 Ben.JP およびオリジナルの XM7 および XM7 For Java 作者は
    一切責任を負いません。

  ・XM7 for Android の基となった XM7 For Java に関しては、
    「ＰＩ．氏」、「たけがみ  りう氏」、「cisc氏」（ＦＭ音源部）
    ならびに「GIMONS氏」が著作権を保持しております。

  ・XM7 For Java のベースとなった XM7 に関しては、
    「ＰＩ．氏」、「たけがみ  りう氏」ならびに「cisc氏」（ＦＭ音源部）
    が著作権を保持しております。

  ・印刷機能のための追加・変更部分、およびV1.1以降の全ての変更に関しては、
    私 Ben.JP が著作権を保持しております。

  ・その他はオリジナルの XM7 For Java（V1.0）に準じます。
    詳細は本アーカイブに添付の XM7src_Java.txt に記載されている
    【ソースコードに関する著作権・免責事項】を御参照ください。

0. DISCLAIMER

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.

1. 著作権法上の警告

XM7 for Java を実行するには、FM-7シリーズ/FM-8のROMデータをファイル化したものが必要です。
ROMデータは、使用者が所有しているFM-7シリーズ/FM-8実機から取り出す必要があります。
実機をお持ちでない方は XM7 for Java を使用することはできませんのでご注意ください。

1. COPYRIGHT WARNING

In order to execute XM7 for Java, ROM data of FM-7 series/FM-8 are required.
The ROM data SHALL BE extracted from the USERS' OWN real FM-7 series/FM-8 machines.
Be carefull, if you do not have any real machines, you cannot use XM7 for Java.


2. 概要：

  FM-7エミュレータ「XM7 for Java」V1.1 L01 (2013/01/12) の、
  全クラスファイル（Jarファイル）ならびにソースコードです。

  ・印刷機能が追加されています。

  ・オリジナルの XM7 For Java（V1.0）についての詳細は、
    本アーカイブに添付の XM7src_Java.txt を御参照ください。

  ・オリジナルの XM7 についての詳細は、
    本アーカイブに添付の XM7src.txt を御参照ください。

3. 動作環境：

  オリジナルの XM7 For Java に準じます。
  詳細は XM7src_Java.txt を御参照ください。
  印刷機能を使用するには、PCに接続され、使用可能な状態に構成された
  プリンタが必要です。（当然ですが…）

  ・現状、私 Ben.JP は
    1. Windows 7 Ultimate (64bit)
    2. Ubuntu 12.04 LTS (64bit)
    上での動作を確認しています。

4. 開発環境：

  私 Ben.JP が開発に用いた環境は以下のとおりです。

  ・開発ツール：
    1. Eclipse IDE for Java Developers (Version: Indigo SR2)
    2. Eclipse Platform (Version: 3.7.2 / Build id: I20110613-1736)

  ・開発プラットフォーム：
    1. Windows 7 Ultimate (64bit)
    2. Ubuntu 12.04 LTS (64bit)

  ・テスト用プラットフォーム：
    1. Windows 7 Ultimate (64bit)
    2. Ubuntu 12.04 LTS (64bit)

  ・Java バージョン：
    1. Java-SE 6 (Version 1.6) / JRE 6 (Version 1.6.0_38)
    2. JDK 6 (Version 1.6) / JRE 6 (Version 1.6.0_24)

5. 使用方法：

  ・印刷機能以外の使用方法については、本アーカイブに添付の
    XM7src_Java.txt を御参照ください。

  ・印刷機能を使用するには、LPRINT、LLIST、HARDC（ビットイメージ出力にも
    対応しています）等の印刷用BASICコマンドや、プリンタポートを制御するプログラム等を
    実行して、印刷データを出力した後、
    「ファイル(F)」-「印刷(P)...」をクリックします。
    印刷ダイアログボックスが現れます。
    あとは通常のJavaアプリの印刷の場合と同様です。

  ・一度印刷されたデータは消去されます。
    次の「ファイル(F)」-「印刷(P)...」では、直近の印刷の後に出力された
    データのみが印刷されます。

6. 仕様、注意点

  ・富士通純正ドットインパクトプリンタ「シリアルドットプリンタ MB27403」
    の機能を一通り実装することを目標にしています。
    ※現時点においては、印刷機能は『暫定的な実装』です。

  ・MB27403は、EPSON製「MP-80 TYPE III」のOEM、すなわち実質的な同一機種
    であると仮定しています。（下記参考文献の記述内容より推測しました。）
    ・MB27403及び MP-80 TYPE III の詳細技術情報が未入手のため、
      仕様の一部は「MX-80 TYPE II」（「MP-80 TYPE II」の海外版）および
      「FX-80」（「FP-80」の海外版）のマニュアル（参考文献(iii)および(v)）
      よりの推測です。
      ・FX-80 のマニュアルには MX-80 TYPE III の情報が載っていました。

  ・対応しているプリンタ制御コードは、9-Pin ESC/P のサブセットです。
    具体的には、以下の制御コードに対応しています。

    - CR  (0x0d) --- 復帰（改行なし）
    - LF  (0x0a) --- 復帰改行
    - HT  (0x09) --- 水平タブ
    - VT  (0x0b) --- 垂直タブ ※1
    - FF  (0x0c) --- 改ページ
    - BS  (0x08) --- バックスペース ※2
    - DEL (0x7f) --- 1文字削除

    - [ESC]@ (0x1b21)   --- 初期化 ※3
    - [ESC]0 (0x1b30)   --- 改行量を1/8インチに設定
    - [ESC]1 (0x1b31)   --- 改行量を7/72インチに設定
    - [ESC]2 (0x1b32)   --- 改行量を1/6インチに設定
    - [ESC]3 (0x1b33)   --- 改行量を1/216インチ単位で指定
    - [ESC]A (0x1b41) --- 1/72インチ単位の改行量の指定
    - [ESC]K (0x1b4b) --- 8ドット単密度ビットイメージモードの指定
    - [ESC]L (0x1b4c) --- 8ドット倍密度ビットイメージモードの指定
                          （HARDCコマンドのビットイメージ出力に用いられる）

    - [FS]&  (0x1c26) --- 漢字モードの指定（漢字ON）
    - [FS].  (0x1c2e) --- 漢字モードの解除（漢字OFF）

    ※1 MB27403/MX-80IIIでは「LF」と同じ動作。（参考文献(i)および(v)より）
    ※2 MB27403/MX-80IIIでは「DEL」と同じ動作。（参考文献(i)より）
    ※3 暫定実装：MB27403の仕様（参考文献(i)）に記述なし

  ・文字（英、数、半角カナ、グラフィックス記号）及びグラフィックデータは、
    プリンタのドットを模したビットイメージで表示されます。
    （英数半角カナ文字は表示の選択が可能：後述。）

  ・グラフィックス記号（文字コード 0x80-0xa0, 0xe0-0xff）は、
    常にビットイメージとして印刷されます。

  ・プリンタ側で漢字を出力できます。
    ESC/P制御コードのFSシーケンス(上述)で漢字ON/OFFを行います。
    漢字コードはJIS(JIS X 0208-1983)です。
    （出力の有無の選択が可能：後述。）

  ・プリンタ機能を有効化するか否かの選択ができます。
    「ツール」-「設定」-「ポート」ページで
     プリンタ「有効」にチェックすると、プリンタ機能が使用可能になります。

  ・余白は、左右が3.4mm、上が11.7mm、下が5.9mmです。
    （参考文献(iii)の記述よりの推測です。）

  ・BASICコマンドの完了途中で「印刷(P)...」を行うと、出力途中の結果が
    印刷されます。（完了に比較的長い時間がかかるHARDCコマンドの場合に、
    特に顕在化します。）
    これを防止する（コマンド終了まで印刷メニューをdisableする、等）
    うまい方法が現時点では見つけられないため、これは現時点での「仕様」と
    させてください。

  ・XM7 for Java をリセットしても、出力された未印刷のデータは消去されません。
    （とりあえずこうしてみました。ちょっとおかしな気もしますが、
      「コマンド終了」=「印刷完了」と考えれば、これでよいような気もします。
      もし動作を変更するとしても、次のバージョン以降とします。）

  ・未印刷のデータは、ステートファイルのセーブ・ロードには対応していません。
    未印刷のデータが存在する状態でステートファイルにセーブしても、
    その未印刷のデータはセーブされません。ロードの場合も同様です。

  ・未印刷のデータが存在する状態で XM7 for Java を終了すると、
    その未印刷のデータは印刷されずに消去されます。

  ・V1.0.05 LP06 より、
    ステートファイルの形式をオリジナル版と完全に一致させました。
    よって、ステートファイルには互換性があります。
    ※プリンタ有効化フラグは廃止しました。
    　プリンタ有効化の状態は .INIファイルに既に記憶されているので、
    　ステートファイルには不要（むしろ邪魔）なためです。

  ・V1.0.05 LP06 より、
    .INIファイル中の、プリンタ有効化の状態を保持するセクションの名称を
    [Port] から [Printer] に変更しました。
    V1.0.05 LP05 以前の.INIファイルを継続して使用する場合、
    .INIファイル中に不要な [Port]セクションが残ることになります。
    実害は全くありませんが、気になる方は.INIファイル中から手動で
    [Port]セクションを削除するか、.INIファイル自体を一旦削除してください。
    ※.INIファイルを削除した場合、全ての設定は規定値に戻りますので、
    　ご注意ください。

7. 制限事項：

  ・MB27403のプリンタ制御コード／シーケンスのうち、未実装のものがあります。
    具体的には以下のものです。

    - BEL (0x07) --- ブザー
    - SO  (0x0e) --- 横2倍拡大文字の指定
    - SI  (0x0f) --- 縮小文字の指定
    - DC2 (0x12) --- SI機能の解除
    - DC4 (0x14) --- SO機能の解除

    - [ESC]C     (0x1b43)   --- 1ページ当りの行数の指定
    - [ESC]C NUL (0x1b4300) --- 1ページ当りのインチ数の指定
    - [ESC]J     (0x1b4a)   --- 改行量を1/216インチ単位で単発で指定
    - [ESC]D     (0x1b44)   --- 水平タブの設定
    - [ESC]Q     (0x1b51)   --- 印字桁数の設定
    - [ESC]N     (0x1b4e)   --- スキップパーフォレーションの設定 ※1
    - [ESC]O     (0x1b4f)   --- スキップパーフォレーションの解除 ※1
    - [ESC]G     (0x1b47)   --- 二重印字の設定
    - [ESC]H     (0x1b48)   --- 二重印字の解除
    - [ESC]S     (0x1b53)   --- スーパースクリプト／サブスクリプトの設定
    - [ESC]T     (0x1b54)   --- スーパースクリプト／サブスクリプトの解除
    - [ESC]E     (0x1b45)   --- 強調文字の設定
    - [ESC]F     (0x1b46)   --- 強調文字の解除
    - [ESC]-     (0x1b2d)   --- アンダーラインの設定／解除
    - [ESC]W     (0x1b57)   --- 横2倍拡大文字の設定／解除
    - [ESC]8     (0x1b38)   --- 紙検出信号の無効化 ※2
    - [ESC]9     (0x1b39)   --- 紙検出信号の有効化 ※2

    ※1 実装未定：連続用紙への対応は未定
    ※2 実装未定：実装仕様が未だ不明確

    ※ 「[ESC]B - 垂直タブの設定」は、
        MB27403には実装されていなかった可能性が高いです。
        （参考文献(i)及び(v)より。）

  ・水平タブは8文字で固定です。

  ・印刷用フォントのビットイメージは、
    プリンタ内蔵フォント（9x6ドット）ではなく、
    画面表示用のビットイメージフォント（8x8ドット）で代用しています。

  ・Linux系OS の場合、『余白』をプリンタの印字可能領域ギリギリに設定すると、
    うまく印刷できる場合があります。（例：Ubuntu 12.04 LTS）
     - Ubuntu (12.04 LTS) の場合、テストページにおいて印字可能領域との境界が
       太い黒枠で表示されるので、それを用いて計測可能です。
     - 私の所有する『Canon MP950』の場合、
       A4:【左：3.6mm、右：0.0mm、上：5.5mm、下：0.0mm】
       で、うまく表示されました。

  ・実行中、低頻度ですが音飛びが発生して画面が引っかかります。
    また、音飛びしない場合は、画面がひどくカクついた動きになります。
    ・環境やFM-7用ソフトが全く同じはずでも、時によってどちらか一方が発生するなど、
      現象が一定しません。

8. バグ：

  ・（現状なし）

9. バグ履歴：

  ・V1.0.05 LP03 (2011/11/30):
    - プリンタ制御コードの ESC A において、
      改行幅が 1/60インチ単位であった実装を、1/72インチ単位に変更した。
      - 元々HARDCコマンドは9-Pinのドットインパクトプリンタを想定していると思われ、
        この場合は ESC/P（24ピン）の仕様である 1/60インチ単位よりも、
        9-Pin ESC/P の 1/72インチ単位を採用する方が適切だと考えた。

  ・V1.1 L00 (2012/12/22):
    - 「HARDC 1」コマンドの印刷結果が正しくなかった。
      - byte型(BYTE型)の符号あり／なしの扱いが、JavaとC/C++で異なっていたため。
      - V1.1 L01 で修正した。

10. 更新履歴：

  - V1.1 L01 (2013/01/12):
    - 「『HARDC 1』コマンドの印刷結果が正しくない」バグを修正した。
      - byte型(BYTE型)の符号あり／なしの扱いが、JavaとC/C++で異なっていたため。
    - ストリーム用バッファのサイズをAudioLineサイズと同じにし、
      Play直後にバッファの半充填が行われるようにした。
      - ノイズは減少したが、消滅したわけではない。
    - Stop時再Select時にflush()及びバッファをクリアするようにした。
      - 発音途中で再Selectした場合の残存ノイズが発生しにくくなった。
    - LockVM() / UnlockVM() を実装した。
      - Java の Lockインターフェイスを用いた。

  - V1.1 L00 (2012/12/22):
    - 「XM7 for Java」と改名。
      - V1.0 の作者の GIMONS氏より開発およびサポートを引き継いだ。
    - 印刷機能を「XM7LP V3.4L52LP12」相当に変更した。
      - ただしバグあり。
    - 文字コードをUTF-8に、改行コードをLFに変更した。
      - Ubuntu上でも開発が行えるようにするため。
    - VM部をスレッド化し、メインスレッドとは独立に動作するようにした。
      - 一定の同期機構は持たせた。
    - 一部のアプリケーションで、音飛びが頻発する問題を改善した。
      - AudioLineへの書き込み方法を変更した。
        (non-blocking write -> blocking write)
      - 音飛びが全くなくなったわけではない。
    - その他、修正箇所、リファクタリング箇所、多数。

  - V1.0.05 LP07 (2012/12/15):
    - 開発／実行時のJREのバージョンを1.6に変更した。
      - Linux系の環境（Ubuntu等）で、より一般的なバージョンを選んだ。
    - lprRenderクラスをSys_lprの nested class として定義し直し、
      名前を『lprRenderer』クラスに改めた。
      - メソッド名も一部変更した。

  - V1.0.05 LP06 (2012/09/09):
    - ステートファイルの形式をオリジナル版と完全に一致させた。
    - 名称の変更「ポート」→「プリンタ」において、不完全だった部分を修正した。
      - .INIファイル中のセクションの名称 [Port] を [Printer] に変更した。

  - V1.0.05 LP05 (2012/09/09):
    - メニュー項目（「ツール」-「設定」内）及びダイアログ中の記述
      「ポート」を「プリンタ」に変更した。
      - 「XM7LP」および「XM7 for Android」における変更に追従するため。
    - 「バージョン情報」ダイアログ中の記述の整理。

  - V1.0.05 LP04 (2012/06/04):
    - ESC A の改行幅を 1/72インチ単位に変更した。

  - V1.0.05 LP03 (2011/11/30):
    - PRINT_ERROR()メソッドを、Sys_lprクラスに移動した。
      （機能上の変更はない。）

  - V1.0.05 LP02 (2011/10/15):
    - プリンタ機能を有効化するか否かの選択を、
      「ツール」-「設定」-「ポート」画面で行えるようにした。

  - V1.0.05 LP01 (2011/03/31):
    - 印刷関連のエラーメッセージを、標準エラー出力へではなく、
      ダイアログメッセージとして表示するようにした。

  - V1.0.05 LP00 (2011/03/25):
    - 公開用初版
      - 印刷機能については、
        XM7LP (Win32版) V3.4L40LP02/V2.9L40LP02/V1.1L30LP02 (2011/03/19)
        と同等

11. 今後の目標：

  ・将来的に、富士通純正ドットインパクトプリンタ、
    具体的には「シリアルドットプリンタ MB27403」の機能を
    ひと通り実装することを目標にしています。
    （ただ、実際に実現できるのはいつになることやら…）

12. 終わりに：
  すばらしいソースを公開していただいた「ＰＩ．」氏、
  「たけがみ  りう」氏、「cisc」氏、そして「GIMONS」氏に
  感謝致します。

========================================================================
