==============================================================================
    HITACHI BASIC MASTER LEVEL3 MARK5 Emulator

Copyright(C) Common Source Code Project, Sasaji 2011-2023 All Rights Reserved.
==============================================================================


----------------------------------------
● デバッガについて
----------------------------------------

  メニューの「オプション」→「デバッガを開始」(またはAlt+D)で開始します。

  デバッガを開始すると、エミュレータが一時停止状態になります。
  Windows版ではコンソールウィンドウが表示されます。
  そのほかの機種では、TELNET端末(*)から接続することで操作可能になります。

  (*)TELNET端末の起動方法

  MacOSX:
    ターミナル(アプリケーションのその他にあります)を開き、
      telnet localhost 54321
    と入力しReturnを押します。

    * 10.13以降ではtelnetがインストールされていません。
      Appストアにあるアプリを使用するかHomebrewからインストールしてください。

  Linux:
    GNOME端末,Konsole,xtermなどから
      telnet localhost 54321
    と入力しEnterを押します。

  Windows:
    Tera TermやPuTTYなどを使用して、
      ホスト名:localhost  ポート番号:54321
    に設定して接続します。

  ○設定ダイアログのネットワークタブ、または設定ファイル(bml3mk5.ini)の
    [debugger]セクションでホスト名、ポート番号を設定できます。

    * リモートホストからデバッガに接続する場合は、
    ServerHostを 0.0.0.0 にします。(別途、ファイアウォールなどの設定も必要）


----------------------------------------
● デバッガのコマンド
----------------------------------------

  起動するとプロンプト"MC6809 - "が表示されますので、ここでコマンド入力します。

  ? でコマンド一覧を表示します。
  各コマンドの詳細は ? <コマンド> または、<コマンド> ? で表示されます。

  ◆コマンド内で指定する数値は16進数です。10進数で指定する場合は先頭に%を
    つけます。(一部例外あり)

  ◆カーソルキーの上下で入力したコマンドの履歴を表示します。


----------------------------------------
● デバッガのコマンド一覧
----------------------------------------

  ◆ D - メモリの内容をダンプする。

  書式: D [<start address> [<end address>]]
  <start address> - 開始アドレスを指定
  <end address> - 終了アドレスを指定
  終了アドレスを指定しない場合、開始アドレスから128バイトをダンプします。


  ◆ DP - 物理メモリの内容をダンプする。

  書式: DP [<type> [<start address> [<end address>]]]
  <type> - メモリの種類を指定
    0 : メインRAM
    1 : 拡張RAM
    2 : カラーRAM
    3 : IG RAM (青)
    4 : IG RAM (赤)
    5 : IG RAM (緑)
  <start address> - 開始アドレスを指定
  <end address> - 終了アドレスを指定
  終了アドレスを指定しない場合、開始アドレスから128バイトをダンプします。

  メインRAMのff00～ffefはI/Oポートとなります。なお通常リードできないポートも
  読むことができます（一部）。


  ◆ E, EB, EW, ED, EA - メモリを編集する。

  書式: E[{B,W,D}] <address> <value> [<value> ...]
        EA <address> "<string>"
  <address> - アドレスを指定
  <value> - 書き込む値を指定
    E,EBは1バイト、EWは2バイト、EDは4バイトで指定
  <string> - アスキー文字列を指定


  ◆ EP, EPB, EPW, EPD, EPA - 物理メモリを編集する。

  書式: EP[{B,W,D}] <type> <address> <value> [<value> ...]
        EPA <type> <address> "<string>"
  <type> - メモリの種類を指定。詳細はDPコマンド参照。
  <address> - アドレスを指定
  <value> - 書き込む値を指定
    EP,EPBは1バイト、EPWは2バイト、EPDは4バイトで指定
  <string> - アスキー文字列を指定


  ◆ R - CPUのレジスタを表示/編集する。

  書式: R [<reg> <value>]
  <reg> - レジスタ名を指定
    レジスタ名は A,B,DP,CC,X,Y,S,U,PC
  <value> - 書き込む値を指定
  レジスタ名、値を指定すると、そのレジスタの値を変更します。


  ◆ RD - 指定デバイスのレジスタを表示/編集する。

  書式: RD <device name> [<regno> <value>]
  <device name> - 以下のデバイス名を指定
    PIA,ACIA,CRTC,KB,CMT,TIMER,FDC3,FDC5,FDDUNIT,PSG60,PSG61,PSG90,PSG91,PSG92,
    PIAEX,ACIAEX,VIA,PIAEX2,RTC,MSM58321,BOARD
  <regno> - レジスタ番号を指定
    レジスタ番号は各デバイスのレジスタを表示させたときのインデックス番号です。
  <value> - 書き込む値を指定
  レジスタ番号、値を指定すると、そのレジスタの値を変更します。


  ◆ M - 現在のメモリマップを表示する。

  バンク切換えの状態を確認できます。


  ◆ S, SB, SW, SD, SA - メモリ内のデータを検索する。

  書式: S[{B,W,D}] <start address> <end address> <list>
        SA <start address> <end address> "<string>"
  <start address> - 開始アドレスを指定
  <end address> - 終了アドレスを指定
  <list> - 空白区切りで値を指定
    S,SBは1バイト、SWは2バイト、SDは4バイトで指定
  <string> - アスキー形式文字列を指定

  検索実行中にESCキーを押すと処理を中断します。


  ◆ SP, SPB, SPW, SPD, SPA - 物理メモリ内のデータを検索する。

  書式: SP[{B,W,D}] <type> <start address> <end address> <list>
        SPA <start address> <end address> "<string>"
  <type> - メモリの種類を指定。詳細はDPコマンド参照。
  <start address> - 開始アドレスを指定
  <end address> - 終了アドレスを指定
  <list> - 空白区切りで値を指定
    SP,SPBは1バイト、SPWは2バイト、SPDは4バイトで指定
  <string> - アスキー形式文字列を指定

  検索実行中にESCキーを押すと処理を中断します。


  ◆ U - メモリ内のデータを逆アセンブルする。

  書式: U [<start address> [<end address>]]
  <start address> - 開始アドレスを指定
  <end address> - 終了アドレスを指定
  終了アドレスを指定しない場合、16ステップ分逆アセンブルします。


  ◆ UP - 物理メモリ内のデータを逆アセンブルする。

  書式: UP <type> [<start address> [<end address>]]
  <type> - メモリの種類を指定。詳細はDPコマンド参照。
  <start address> - 開始アドレスを指定
  <end address> - 終了アドレスを指定
  終了アドレスを指定しない場合、16ステップ分逆アセンブルします。


  ◆ SL - 逆アセンブルで使用するシンボルラベルを登録・表示する。

  書式: SL [<address> <label>]
  <address> - アドレスを指定(16ビットで指定)
  <label>   - ラベル名を指定(最大16文字のアスキー文字)


  ◆ SLL - 逆アセンブルで使用するシンボルラベルをファイルから読む。

  書式: SLL <file path> [R|TSC]
  <file path> - ファイル名
  R           - アドレスとラベル名が逆になっているファイルを読む。
  TSC         - ラベル名,タイプ,アドレスの順になっているファイルを読む。
  読み込みに成功すると以前のシンボルはすべて削除されます。

  ファイルの書式：デフォルトでは1行ごとに以下のように記述します。
    アドレス ラベル名 アドレス ラベル名 ...
  Rを指定した時：
    ラベル名 アドレス ラベル名 アドレス ...
  TSCを指定した時：
    ラベル名 タイプ アドレス ラベル名 タイプ アドレス ...
    (タイプ部分は無視します。)
  *区切り記号はスペース、タブ、コンマ、セミコロンが使用できます。


  ◆ SC - シンボルラベルを削除する。

  書式: SC {*,ALL,<address>}
  <address> - アドレスを指定
  * または ALL - すべてを対象にします。


  ◆ H - 値1と2をたし算、引き算した結果を表示する。

  書式: H <value1> <value2>


  ◆ DN - ダンプファイルのファイル名を表示/設定する。
  ◆ DL - ダンプファイルからメモリにロードする。
  ◆ DS - メモリ内容をダンプファイルにセーブする。

  書式: DN [<filename>]
        DL <start address> [<end address>]
        DL <offset address>  (Intel hex/Motorola Sフォーマットのとき)
        DS <start address> <end address>
  <filename> - ファイル名を指定
  <start address> - 開始アドレスを指定
  <end address> - 終了アドレスを指定
  <offset address> - 開始アドレスからのオフセットを指定
    ファイル名のデフォルトは"debug.bin"
  ダンプファイルのフォーマットは拡張子で決まります。
    ".hex"           - Intel hex フォーマット
    ".s"または".mot" - Motorola S フォーマット
    上記以外は、バイナリになります。
  Intel hexやMotorola Sフォーマットからロードする場合、開始アドレスは
  ファイル内のデータで設定されます。


  ◆ DPL - ダンプファイルから物理メモリにロードする。
  ◆ DPS - 物理メモリ内容をダンプファイルにセーブする。

  書式: DPL <type> <start address> [<end address>]
        DPL <type> <offset address>  (Intel hex/Motorola Sフォーマットのとき)
        DPS <type> <start address> <end address>
  <type> - メモリの種類を指定。詳細はDPコマンド参照。
  残りの指定方法は、DL,DSコマンドと同じです。


  ◆ DIS - メモリ内容をbmpファイルにセーブする。

  書式: DIS <type>
  <type> - メモリの種類を指定。
    0 : IG RAM (ALL)
    1 : IG RAM (青)
    2 : IG RAM (赤)
    3 : IG RAM (緑)
  保存ファイルはYYYY-MM-DD_HH-MI-SS.bmpまたは.pngとなります。
  ファイル形式は設定ダイアログにて指定した形式となります。
  スナップショットパスを設定している場合は、そのフォルダ内に保存されます。  


  ◆ G - 一時停止している処理を続行する。

  書式: G [{<address>,<sign>}]
  <address> - 停止するアドレスを指定
  <sign> - 以下の記号を指定
   "n"または"N"を指定した時は、次のアドレスを設定します（ステップオーバー）。
    これは、次の命令がサブルーチンにジャンプする命令の場合、サブルーチンから戻って
  くるまでを実行します。
  アドレスや記号を指定すると、そのアドレスがブレークポイントのリストに登録され、
  ほかのブレークポイント、トレースポイントはすべて無効状態になります。
  ブレークポイントに達すると処理を停止します。

  Gコマンド実行中にESCキーを押すと処理を停止します。


  ◆ T - トレース（逆アセンブル）しながら実行する。

  書式: T [<count> [<skip count>]]
  <count> - トレースする回数を指定
  <skip count> - スキップ数を指定。デフォルトは0
  スキップ数を指定すると、指定の数だけ命令を実行したのち1回トレースします。
  この場合、全ステップ数は<トレース回数>*<スキップ数+1>となります。

  Tコマンド実行中にESCキーを押すと処理を停止します。


  ◆ TB - トレースバック。最近実行した命令をさかのぼって表示する。

  書式: TB [<count>]
  <count> - トレースバックするステップ数を指定(最大1000)。デフォルトは25。

  ◆ RS - トレース中CPUのレジスタを表示する。
  ◆ RH - トレース中CPUのレジスタを非表示にする。

  書式: RS, RH


  ----------------------------------------
  ■ブレークポイント、トレースポイント

  ブレークポイントは条件に一致するとそこで処理を停止します。
  トレースポイントは条件に一致するとそこの命令をトレースします。停止はしません。

  ◆ BP  - CPUが指定アドレスのOPコードをフェッチする前に停止する。
  ◆ RBP - CPUが指定アドレスのメモリをリードした後に停止する。
  ◆ WBP - CPUが指定アドレスのメモリをライトした後に停止する。
  ◆ NBP - 割り込みが発生した時に停止する。
  ◆ TP  - CPUが指定アドレスのOPコードをフェッチする前にトレースする。
  ◆ RTP - CPUが指定アドレスのメモリをリードした後にトレースする。
  ◆ WTP - CPUが指定アドレスのメモリをライトした後にトレースする。
  ◆ NTP - 割り込みが発生した時にトレースする。

  書式: {B,T}P [{<address(es)>,<sign>} [<expression>]]
        {R,W}{B,T}P [<address(es)> [<value>]]
        N{B,T}P [<signal name> [<switch>]]
  <address(es)> - アドレスを指定
   アドレスは1つまたは、<開始アドレス>-<終了アドレス>のようにハイフン(-)を使用
  して範囲を指定することができます。
  <sign> - 以下の記号を指定
   "."(ピリオド)を指定した時は、現在のアドレス(次に実行する命令のアドレス)を
  設定します。
   "n"または"N"を指定した時は、次のアドレス(次に実行する命令のアドレスの後)を
  設定します。
  <expression> - 式を指定
   式を指定すると、指定したレジスタの値が一致した時に停止します。
   <レジスタ名>=<値> の形で指定します。
  <value> - 値を指定
   また、"value&mask"の形式で値とマスクを指定することができます。
   リード時は読み込んだ値、ライト時は書き込んだ値が一致した時に停止します。
  <signal name> - RESET,NMI,IRQ,FIRQ,HALTのいずれかを指定
  <switch> - 以下のいずれかを指定
   "ON"を指定または引数を省略すると、割り込みが発生した時点を捕捉します。
   "OFF"を指定すると、割り込みが解除された時点を捕捉します。
   "CHG"を指定すると、割り込み状態が変化した時点を捕捉します。

  コマンドオプションを指定しない場合、現在登録しているポイントの一覧を表示
  します。

  登録はそれぞれ64個までです。同時に有効にできるのはそれぞれ8つまでになります。


  ◆ BC,  BD,  BE  - BPで設定したブレークポイントを操作
  ◆ RBC, RBD, RBE - RBPで設定したブレークポイントを操作
  ◆ WBC, WBD, WBE - WBPで設定したブレークポイントを操作
  ◆ NBC, NBD, NBE - NBPで設定したブレークポイントを操作
  ◆ TC,  TD,  TE  - TPで設定したトレースポイントを操作
  ◆ RTC, RTD, RTE - RTPで設定したトレースポイントを操作
  ◆ WTC, WTD, WTE - WTPで設定したトレースポイントを操作
  ◆ NTC, NTD, NTE - NTPで設定したトレースポイントを操作

  コマンドの末尾がC: ブレークポイント、トレースポイントを削除する。
  コマンドの末尾がD: ブレークポイント、トレースポイントを一時無効にする。
  コマンドの末尾がE: ブレークポイント、トレースポイントを有効にする。

  書式: [{R,W,N}]{B,T}{C,D,E} [{*,ALL,<list>}]
  <list> - インデックス番号を指定。10進数で指定してください。複数指定できます。
  * または ALL - すべてを対象にします。

  コマンドオプションを指定しない場合、現在登録しているポイントの一覧を表示
  します。


  ◆ BL - すべてのブレークポイント一覧を表示します。
  ◆ TL - すべてのトレースポイント一覧を表示します。


  ----------------------------------------

  ◆ CL - 現在のクロック数、経過時間を表示します。


  ◆ > - ログファイルを開く/閉じる。

  書式: > [<filename>]
  ファイル名に"CLOSE"を指定するとログファイルを閉じます。
  ファイル名を指定しない場合、現在のファイル名を表示します。


  ◆ PWD - 現在の作業ディレクトリを表示する。


  ◆ CD - 作業ディレクトリを変更する。

  書式: CD <path>


  ◆ DIR, LS - 現在のディレクトリ内のファイルを表示する。

  書式: DIR
        LS


  ◆ ! - エミュレータ(VM)にコマンドを送信する。

  ! reset [all,cpu] - リスタート(パワーonリセット)を送信。
  ! key <code> [<msec>] - キーコードを送信。


  ◆ Q - デバッガを終了する。


  ----------------------------------------
  ■ BAS - LEVEL-3 BASICデバッガ

  ◆ BAS VAR - BASICの変数の一覧を表示する。

  書式: BAS VAR [<name(s)> ...]
  <name(s)> - 一致する変数（配列変数を含む）の名称および値を表示します。


  ◆ BAS LIST - BASICプログラムリストを表示する。

  書式: BAS LIST [<line number(s)>]
  <line number(s)> - 表示する行番号を10進数で指定します。
        行番号は<開始行番号>-<終了行番号>のようにハイフン(-)を使用して
        範囲を指定することができます。
        また"."(ピリオド)を指定すると、現在実行している行を表示します。

  【注意】ASCII、半角カナ以外の文字は"."になります。半角カナは端末がシフトJISに
          対応していないと表示されません。
  【注意】拡張BASIC命令を追加した後は、BAS COMMANDを実行し予約語一覧を読み直して
          下さい。


  ◆ BAS BP - ブレークポイント。BASICの行番号が一致した時に停止する。
  ◆ BAS TP - トレースポイント。BASICの行番号が一致した時にリストを表示する。

  書式: BAS {B,T}P [<line number(s)>]
  <line number(s)> - 表示する行番号を10進数で指定します。
        行番号は<開始行番号>-<終了行番号>のようにハイフン(-)を使用して
        範囲を指定することができます。
        また"."(ピリオド)を指定すると、現在実行している行を対象にします。

  コマンドオプションを指定しない場合、現在登録しているポイントの一覧を表示
  します。


  ◆ BAS BC, BAS BD, BAS BE
  ◆ BAS TC, BAS TD, BAS TE

  コマンドの末尾がC: ブレークポイント、トレースポイントを削除する。
  コマンドの末尾がD: ブレークポイント、トレースポイントを一時無効にする。
  コマンドの末尾がE: ブレークポイント、トレースポイントを有効にする。

  書式: BAS {B,T}{C,D,E} {*,ALL,<list>}
  <list> - インデックス番号を指定。
  * または ALL - すべてを対象にします。


  ◆ BAS TB - 最近実行したBASICプログラムのリストをさかのぼって表示する。

  最大、64行まで表示します。


  ◆ BAS TRON  - ブレークポイント、トレースポイントでリストを表示する。
  ◆ BAS TROFF - ブレークポイント、トレースポイントでリストを表示しない。


  ◆ BAS COMMAND - BASIC予約語の一覧を表示する。

  BASIC予約語をメモリから読み出し一覧にして表示します。
  予約語一覧はデバッガ内部でキャッシュされます。


  ◆ BAS ERROR - BASICのエラーを表示する。

  書式: BAS ERROR [<error number>]
  <error number> - エラー番号を指定。
        エラー番号を指定すると、その番号のエラーメッセージを表示します。
        エラー番号を省略すると、最後に発生したエラーを表示します。


----------------------------------------
● トレース時の逆アセンブル書式
----------------------------------------

  [a]- [b]----------- [c]--------------- [d]  [e]
  23AB B7 FF D0       STA $FFD0          ( 3) (W FFD0:04)                ←[1]
DP:00 A:04 B:03 X:0F84 Y:FDC4 U:FF18 S:9ED0 CC:[-F-I-Z--] FIRQ(0001)     ←[2]
> 23AE 86 04          LDA #$04                                           ←[3]

  [1] 実行したコード
    左から、[a]アドレス、[b]マシン語コード、[c]ニーモニック、
    [d]消費マシンサイクル、[e]メモリリード/ライト時の値

  [2] CPUのレジスタ値 と 発生している割り込み
    割り込み名の後ろにつく数値は、割り込みを発生させているデバイスを16進数で
    示しています。各割り込みに対する数値の意味は以下の通り：
   NMI:
    0001 トレース
    0004 フロッピーディスク
    0008 BREAKキー押下
   IRQ:
    0001 キーボード押下
    0002 ライトペン押下
    0004 PIA Aポート
    0008 PIA Bポート
    0010 拡張PIA Aポート
    0020 拡張PIA Bポート
    0040 ACIA
    0080 拡張ACIA
    0100 9声PSG VIAタイマ
   FIRQ:
    0001 1/60secタイマ
   HALT:
    0002 8インチフロッピーディスク

  [3] 次に実行するコード


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