WozMonはAPPLE-1のROMに搭載されていたモニタプログラムで、256バイトと非常にコンパクト(小さいと思う6800のMIKBUGのさらに半分の大きさです。)ながら、以下のような機能を持っています。
- メモリのダンプ表示
- RAMの書き換え
- ダンプコードの読み込み
- プログラムの実行
WozMonの簡単な紹介と使用法が下記のWEBページに紹介されています。
WozMonのソースコード
WozMonは多くの方がWEB上でソースコードを公開されています。
色々と見比べて(使用するアセンブラによる表現形式の違いがありますが、内容的には同じものです)みましたが、記述形式が一番しっくり来たJeff Tranter 氏の下記のソースコードを利用させていただきました。
- https://github.com/jefftranter/6502/blob/master/asm/wozmon/wozmon.s
- https://github.com/jefftranter/6502
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 を再起動します。
ブロック | ジャンパ | 設定 | 機能 | 選択 |
JP1 | SEL2 | オープン | アドレスマップ選択 | STDモード |
SEL3 | オープン | |||
JP2 | ROM0 | ショート | モニタ選択 | Universal Monitor(IO-C000) |
ROM1 | オープン | |||
JP3 | – | どちらでも可 | 不使用 |
WozMonのロードと起動
Universal Monitor を使用して以下の手順で[XUM-APPLE1-std.SREC]をメモリにロードしWizMonを起動します。
- Lを入力してエンターキーを押すと、Universal Monitor はSレコードの読み込み用に待機状態になります。
- この状態でTeraTermのメニューから[File ->Send file…]を選択します。ファイルダイアログが開くので、[XUM-APPLE1-std.SREC]を指定します。
- ファイル転送のダイアログが開き転送経過を表示し、数秒で読み込みが終了します。
- ファイルの読み込みが終了したら、確認のためUniversal Monitor のプロンプトに対してRとエンターを入力します。(確認を行わなくてもかまいません)
- 6502のレジスタの値が表示され、PCにWozMonの開始アドレスであるDF00が設定されていることがわかります。
- Gとエンターを入力すると、WozMonが起動します。
- WozMonが起動されてもプロンプトとして単に’ \ ‘が表示されるだけで、わかりやすい起動メッセージは表示されないのでご注意ください。
プロンプトが出力されたWozMonの起動画面を、「WizMonのロードと起動」に示します。
WozMonでのメモリ操作
WozMonによるメモリの操作例を以下に示します。
操作画面例は、「WizMonでのメモリ操作」に示します。
- 2つの16進数をピリオド’.’を挟んで入力すると、その間のメモリの内容が1バイトごとに16進数でダンプ表示されます。
- 例えば300.30Fと入力すると、300〜30Fまでのデータがダンプされる。
- 開始アドレスを16進数で入力した後にコロン’:’を入力し、引き続き16進数をスペースで分けて入力すると、指定した開始アドレスから、入力した数のデータが更新される。
- 例えば、300: 1 2 3A EFと入力すると、300から303までのメモリの内容が指定した値に変更される。
- メモリ内容をダンプすると変更されていることが確認できる。
操作内容と表示を確認してみると、メモリ内容を変更するための入力形式は、メモリのダンプ出力と同形式であることがわかります。
これは、メモリのダンプ結果を保存しておくと、別の機会にその内容をWozMonに入力してやると、保存しておいたファイルのロードができることを意味しています。
メモリのダンプを行うと、一行当たりの文字数・情報が少なくて少し物足りない感じがしますが、WizMonが搭載されていたAPPLE-1のビデオの表示幅が40文字だったことを考えると納得がいきますね。
WozMonでのプログラムの起動
WozMonでは、アドレスを16進数で入力し、その直後にRを入力したうえでエンターを押すと、指定したアドレスからプログラムの実行を開始します。
「WizMonでのプログラム実行」に、APPLE-1 BASICを起動する例を示します。
APPLE-1 BASICの開始アドレスは$E000なので、E000Rを入力し続けてエンターを押します。
この操作でAPPLE-1 BASICが起動されていますが、WozMon同様に起動メッセージはなく、プロンプト’>’が表示されるだけですので注意(起動されたことがわかりにくいですね。)が必要です。
念のため、本当にBASICが起動されているかどうか確認して見ましょう。
下の画面の様に、簡単な入力をしてみました。確かにBASICが起動されているようです。