WozMonはAPPLE-1のROMに搭載されていたモニタプログラムで、256バイトと非常にコンパクト(小さいと思う6800のMIKBUGのさらに半分の大きさです。)ながら、以下のような機能を持っています。

  • メモリのダンプ表示
  • RAMの書き換え
  • ダンプコードの読み込み
  • プログラムの実行

WozMonの簡単な紹介と使用法が下記のWEBページに紹介されています。

WozMonのソースコード

WozMonは多くの方がWEB上でソースコードを公開されています。

色々と見比べて(使用するアセンブラによる表現形式の違いがありますが、内容的には同じものです)みましたが、記述形式が一番しっくり来たJeff Tranter 氏の下記のソースコードを利用させていただきました。

Jeff Tranter 氏の6502のリポジトリはそれだけでかなり楽しめますが、ルートに移ると、6800,6809,8080,68000など気になるもの満載ですね。

WozMonの起動

6502-CORE 用のAPPLE-1の移植パッケージに、WozMonとAPPLE-1 BASICのコードを一つにまとめた下記のSレコードファイルが含まれています。

  • XUM-APPLE1-std.SREC

6502-COREでは、このファイルをUniversal Monitor でダウンロードして実行します。

WozMonの配置アドレスに関する注意

WozMonのオリジナルは$FF00-$FFFFに配置されていますが、6502-CORE ではリセットベクタを含むその場所にすでにUniversal Monitor が配置されているので、WozMonをオリジナルの場所に移植することはできません。

このため、6502-CORE では、WozMonは$DF00-$DFFFに再配置(ちなみにオリジナルの$FXXXにより近い$E000-$EFFFには、APPLE1 BASICのオリジナルの配置位置となっていますので、そこを避けてこの位置に再配置しました。)しています。

したがって、様々な資料に記載されているWozMonそのもののアドレスに関する記述等は、6502-CORE用のWizMonでは、$FFxxを$DFxxに読み替える必要があるので注意してください。

一方、同じパッケージに含まれるAPPLE-1BASICは本来の$E000-$EFFFに配置されています。

6502-CORE のジャンパー設定

上記のWozMonとAPPLE-1 BASICをまとめてRAM上に読み込めるように、アドレスマップは$D000-$EFFFにRAMが配置される移植モードを使用します。

「WozMon使用時のジャンパ設定」にジャンパーの設定を示します。

JP1のSEL0, SEL1は特に指定はありません。

一旦 6502-COREの電源を切り(USBから切り離し)ジャンパーを指定の構成で設定し、6502-CORE を再起動します。

ブロックジャンパ設定機能選択
JP1SEL2オープンアドレスマップ選択STDモード
SEL3オープン
JP2ROM0ショートモニタ選択Universal Monitor(IO-C000)
ROM1オープン
JP3どちらでも可不使用
WozMon使用時のジャンパ設定

WozMonのロードと起動

Universal Monitor を使用して以下の手順で[XUM-APPLE1-std.SREC]をメモリにロードしWizMonを起動します。

  1. Lを入力してエンターキーを押すと、Universal Monitor はSレコードの読み込み用に待機状態になります。
  2. この状態でTeraTermのメニューから[File ->Send file…]を選択します。ファイルダイアログが開くので、[XUM-APPLE1-std.SREC]を指定します。
  3. ファイル転送のダイアログが開き転送経過を表示し、数秒で読み込みが終了します。
  4. ファイルの読み込みが終了したら、確認のためUniversal Monitor のプロンプトに対してRとエンターを入力します。(確認を行わなくてもかまいません)
  5. 6502のレジスタの値が表示され、PCにWozMonの開始アドレスであるDF00が設定されていることがわかります。
  6. Gとエンターを入力すると、WozMonが起動します。
  7. WozMonが起動されてもプロンプトとして単に’ \ ‘が表示されるだけで、わかりやすい起動メッセージは表示されないのでご注意ください。

プロンプトが出力されたWozMonの起動画面を、「WizMonのロードと起動」に示します。

WizMonのロードと起動

WozMonでのメモリ操作

WozMonによるメモリの操作例を以下に示します。

操作画面例は、「WizMonでのメモリ操作」に示します。

  • 2つの16進数をピリオド’.’を挟んで入力すると、その間のメモリの内容が1バイトごとに16進数でダンプ表示されます。
    • 例えば300.30Fと入力すると、300〜30Fまでのデータがダンプされる。
  • 開始アドレスを16進数で入力した後にコロン’:’を入力し、引き続き16進数をスペースで分けて入力すると、指定した開始アドレスから、入力した数のデータが更新される。
    • 例えば、300: 1 2 3A EFと入力すると、300から303までのメモリの内容が指定した値に変更される。
    • メモリ内容をダンプすると変更されていることが確認できる。

操作内容と表示を確認してみると、メモリ内容を変更するための入力形式は、メモリのダンプ出力と同形式であることがわかります。

これは、メモリのダンプ結果を保存しておくと、別の機会にその内容をWozMonに入力してやると、保存しておいたファイルのロードができることを意味しています。

WizMonでのメモリ操作

メモリのダンプを行うと、一行当たりの文字数・情報が少なくて少し物足りない感じがしますが、WizMonが搭載されていたAPPLE-1のビデオの表示幅が40文字だったことを考えると納得がいきますね。

WozMonでのプログラムの起動

WozMonでは、アドレスを16進数で入力し、その直後にRを入力したうえでエンターを押すと、指定したアドレスからプログラムの実行を開始します。

「WizMonでのプログラム実行」に、APPLE-1 BASICを起動する例を示します。

APPLE-1 BASICの開始アドレスは$E000なので、E000Rを入力し続けてエンターを押します。

この操作でAPPLE-1 BASICが起動されていますが、WozMon同様に起動メッセージはなく、プロンプト’>’が表示されるだけですので注意(起動されたことがわかりにくいですね。)が必要です。

WizMonでのプログラム実行

念のため、本当にBASICが起動されているかどうか確認して見ましょう。

下の画面の様に、簡単な入力をしてみました。確かにBASICが起動されているようです。

APPLE-1 BASICの実行確認