2015.1.7

前へ
次へ
ホームページトップへ戻る

MYCPU80でCP/Mを!
超巨大基板の8080互換HCMOS・CPUでCP/Mを走らせてしまおうという、なんとも狂気なプロジェクトです!


[第96回]


●BP@、JP@のテスト

前回はBP@コマンドでブレークポイントを設定したあとJP@コマンドで0100から書いたプログラムを実行しようとしたところハングアップしてしまいました。
この原因はすぐに思い当たりました。
@をつけたコマンドはROMの裏に隠れているRAMをアクセスするために、バンク切換えに影響されないRAMエリアに置かれているCP/M BIOSプログラムにジャンプして、そこでROMからRAMに切り換えてアクセスしたあと、RAMからROMに切り換えて、もとのプログラムに戻るという動作をしています。

ところが前回のテストではCP/M BIOSプログラムをロードせずにいきなりJP@コマンドを使ってしまったものですから、それでハングアップしてしまったのでした。
それならDM@、CM@も同じはずなのですが、実は前回のテスト以前にも何回かデバッグのためにCP/Mプログラムを実行していましたから、それがたまたま部分的に残っていたのだと思います。
@のついたコマンドはZB3BASICのコマンドですが、それを実行するためには一旦は/CPMコマンドを実行してCP/Mシステムをロードする必要がありました。

あれ?
ZB3DOS操作説明書にはそのための注意書きがありませんねえ。
これはうっかりしておりました。
追補を入れることにいたします。

原因がわかりましたから、もう一度ZB3DOSを起動して、/CPMでCP/M互換DOSを起動したあと、ZB3コマンドでZB3BASICに戻りました。

logfile mycpu80log\01061634.txt open
mzbdos3L 2014.12.29 by Chunichidenko

MYCPU80に接続しました(19200bps)
0001 001E - z
1000 00C3 - 
*** mycpu80 zb3basic ****
>/cpm
drive D ................................
drive C ................................
drive B ................................
drive A ................................

A>zb3
end of ZBDOS
>dm@0100,011f
0100  01 34 12 11 78 56 FF AB-90 03 13 23 F6 F9 12 9D  .4..xV.ォ...#....
0110  B5 9D F7 87 FB 9D 52 4C-B6 CB 90 3D A3 57 3F 33  オ.....RLカヒ.=」W?3
>cm@0106
0106 FF-21
0107 AB-
0106 21-
>bp@0106
>jp@0100

A F  B C  D E  H L  PC   SP   SZ H P C
FF44 1234 5678 0100 0106 F7FE 01000100
>

前回はBP@でアドレス0106にブレークポイントを設定したあとでハングアップしてしまいましたから、DM@でプログラムを確認してみましたら、0106がFFに書き換わったままになっています。
FFはRST7の命令コードです。
ZB3BASICのブレーク動作はRST7を利用しています。
命令の第一バイトをFFに置き換えることで、そこでRST7が実行され、ブレーク動作が行なわれます。
ここはCM@コマンドで元通りに戻しました。
そのうえであらためてBP@コマンドでブレークポイントを設定し直した後、JP@コマンドを実行しました。
今度は正しくJP@コマンドが実行された結果、アドレス0106でブレークしました。

●CR、RT@のテスト

ここでレジスタの一部を書き換えてからプログラムの続きを実行させてみることにしました。
ブレーク後にレジスタの値を書き換えるにはCRコマンドを使います。

>cr

A F  B C  D E  H L  PC   SP   SZ H P C
FF44 1234 5678 0100 0106 F7FE 01000100

0144 1234 5678 0100 0106 F7FE 01000100

A F  B C  D E  H L  PC   SP   SZ H P C
0144 1234 5678 0100 0106 F7FE 01000100
>bp@0109
>rt@

A F  B C  D E  H L  PC   SP   SZ H P C
0144 1234 5678 90AB 0109 F7FE 01000100
>dm@0100,011f

ログでは何をやっているかよくわかりませんが、CR[Enter]と入力すると、ブレーク後と同じようにレジスタが表示されますが、プロンプトマーク(>)は表示されずカーソルだけが点滅します。
このときスクリーンエディタが利いていますから[↑]キーで上に表示されているレジスタの値の行にカーソルを移動して、そこで必要ならば[→]キーで書き換えたいレジスタの値のところに移動して、値を書き換えます。
ここではAレジスタの値をFFから01に書き換えました。
最後にその行の位置で[Enter]を入力すると、下にもう一度レジスタの値が表示されて、CRコマンドが完了します。

ううう。
これじゃあよくわかりませんでしょう。
やっぱり画像で説明したほうがよさそうです。
もう一度そこのところをやり直して画像に撮りました。

アドレス0106でブレークしたあとCRを実行しました。

レジスタが表示されたあと > が表示されずにカーソルだけが点滅します。

[↑][→]キーで書き換えたいレジスタの値のところまでカーソルを移動します。


Aレジスタの値を01に書き換えました。

他にも書き換えたいレジスタがあれば[Enter]入力前ならば、この行の中でなら自由に書き換えることができます。
ただし右端のフラグレジスタのビット表示は書き換えることはできません。
フラグレジスタはAレジスタの右側のFレジスタを書き換えます。

最後に[Enter]を入力すると更新後のレジスタが表示されてCRコマンドが完了します。

Aレジスタが01に書き換わっています。

このあと次のブレークポイントを設定して、RT@を実行しました。

RT@コマンドはブレークしたときのレジスタの値を維持したまま(CRコマンドで変更された値はその変更された値をもって)ブレークしたところに戻って実行を再開します。
アドレス0109で再びブレークしました。
AレジスタはCRコマンドで変更した01になっています。

MYCPU80でCP/Mを![第96回]
2015.1.7upload

前へ
次へ
ホームページトップへ戻る