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

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第310回]


●システムプログラムのロード

[第305回]では普通のLoaderプログラムを使って、普通のプログラムをロードしました。
そして[第306回]では、普通のLoaderを使って、データをロードしました。
と、前回はここまで書いてきて、忘れものを思い出したのでした。
今回はその後に続けて書くつもりだったことを書くことにいたします。

そのように普通のLoaderを使って、普通のプログラムやデータをロードしましたが、今回はシステムプログラムをロードしてしまいます。
システムプログラムだって基本的には普通のプログラムと変わりません。
ただ少し長いだけです。

Y様からのご依頼で、E−80(仮称)ミニコンにはND80ZV(ND80Z3.5)のシステムプログラムとCP/Mをロードして動くようにすることになっています。
ND80ZV(ND80Z3.5)のシステムプログラムといいましても、7セグメントLEDや5×5キーボードはE−80(仮称)ミニコンにはありませんから、その機能(TK80モニタやND80Zモニタの機能)は不要です。
パソコンとUSB接続して動作するZB3BASICがその主体になると思います。
ND80ZV(ND80Z3.5)の場合にはZB3BASICもTK80モニタやND80ZモニタとともにROMに書き込まれていて、ZB3BASICはND80Zモニタの機能の一部をシステムでも利用しています。
またUSB接続動作は5×5キーボードからの入力で起動するようになっています。
そのようなところをE−80(仮称)ミニコンに合わせる形で変更した上で、Loaderでロードできるようにファイルにまとめなければなりません。

ND80ZV(ND80Z3.5)のシステムROMはざっくりと、下のようなマップになっています。

0000H〜03FFH TK80モニタプログラム
0400H〜07FFH TK80モニタプログラム(上記プログラムのワークエリアをND80Zモニタにあわせたもの)
0800H〜0FFFH ND80Zモニタプログラム
1000H〜7FFFH ZB3BASICシステムプログラム

E−80(仮称)ミニコン用に変更するにあたり、0000H〜03FFHのTK80モニタ部分は全く不要なため、全面的に削除しました。
0400H〜07FFH、0800H〜0FFFHについても、そのかなりの部分は使わないことになりますが、作業の都合で、いまのところ一部をE−80(仮称)ミニコンのハードに合わせて変更したほかは、当面はそのまま残すことにしました。
BASICの機能についてもハードウェアに合わせて変更が必要なところもありますが、とりあえずはまず動かしてみることを優先していますから、そのあたりは後回しとしました。

また1000H〜7FFFHの範囲についても、実際に使用しているのは1000H〜7F7FHまでのところで、その後ろは空いていますから、そのアドレスを利用してLoaderを置くことにしました(そのことはすでに説明いたしました)。
結局、とりあえずE−80(仮称)ミニコンに移植するための、ZB3BASICシステムファイルは、アドレス0400H〜7F7FHにロードされるものとして作成しました。

さらに最終的には、ファイルの先頭6バイトに@ロード先の先頭アドレスAロード終了アドレスBロード後に実行を開始するアドレス、を埋め込むことにしましたので、そのようなファイルを機械的に作成しやすくするため、ファイルを0400Hからロードしたとして、0400H〜0405Hにはロードアドレス情報が入り、実際のシステムプログラムはその後ろの0406Hから始まるように設計しました。

なんだかよくわからない説明ですけれど、まあ、そういうことなのです。
0400H〜0405Hの情報は普通のLoaderでは使いませんから、とにかくそのようにして作ったファイルを0400Hからロードしたうえで、ロード後に0406Hから実行すれば、めでたくZB3BASICが走り出すことになります。

なにはともあれ、そのロードの実際を見ていただくことにいたします。

パーワーON後は、前回説明しましたように0000H〜0006Hに書かれたサンプルプログラムが実行されますから、まずはSTOPスイッチを押して停止した上でパネルスイッチに7F80HをセットしてREADスイッチを押します。

7F80HにはLoaderプログラムが入っています。
そのロード先アドレスを書き換えます。
本当はこの次のアドレスから書き換えればよいのですけれど、たいした手間ではありませんから、このようにLoaderの先頭アドレスを指定して、そこから見ていくようにしました。

READ NEXTを押しました。

アドレスLEDには7F81Hが表示され、データバスLEDには先にMUSIC用データをロードしたときの下位アドレスFCHが表示されています。

そこを00Hにします。
アドレス下位8ビットとデータ兼用の設定スイッチ(右側の8個)を00Hにして、WRITEスイッチを押しました。

データバスLEDが00Hになり、メモリの7F81Hに00Hが書き込まれました。

続いてデータ設定スイッチに04Hを設定して、WRITE NEXTを押しました。

アドレスLEDに次のアドレス7F82Hが表示され、データバスLEDには04Hが表示されました。
メモリの7F82Hに04Hが書き込まれました。
これで0400Hからプログラムをロードする準備ができました。

STOPスイッチを押しながらREADスイッチを2回押して、アドレス7F80Hに戻ります。

こういうときにREAD DECの機能はとても便利です。

RUNスイッチを押しました。
(この操作の前にUSBケーブルでWindowsパソコンと接続しておきます)


こちらはWindows側の画面です。
USB送信プログラム(hidwr.exe)を使って、E−80用ZB3BASICシステムファイル(E80MON1B.BIN)を送信しました。

送信はほぼ瞬時に完了しました。
32KB程度のファイルならば1秒もかからないくらいで完了してしまいます。

Windows側の送信が完了したことを確認したあと、STOPスイッチを押してLoaderプログラムを停止させました。


本当にロードされたかどうか、確認してみました。
パネルスイッチに0400Hを設定してREADスイッチを押しました。

アドレスLEDに0400Hが表示され、データバスLEDには06Hが表示されました。
おお。
ちゃんとロードできたようです。
ファイルの先頭6バイトには次のデータが書かれています。

0400 06
0401 04
0402 7F
0403 7F
0404 06
0405 04

そのようになっているかどうか、順に確認してみます。
READ NEXTを押しました。


READ NEXTを押しました。


READ NEXTを押しました。


READ NEXTを押しました。


READ NEXTを押しました。


もう一回READ NEXTを押しました。

ここからが本当のプログラム部分です。
ロードしたE−80用ZB3BASICシステムプログラムはここ(0406H)からスタートします。

RUNを押しました。


ここからはWindows側で操作します。
ZB3[Enter]と入力します。

おお。
E−80(仮称)ミニコンにND80ZVモニタプログラムをロードして、それを起動しましたから、ND80ZVとして認識したようです。
ここでz[Enter]と入力するとZB3BASICが起動します。

ZB3BASICが起動しました。

WindowsマシンのDOSプロンプト(コマンドプロンプト)に表示されていますから、Windows上でプログラムが動いているように見えますが、USBで接続されているE−80(仮称)ミニコンから表示データが送られてきているだけで、BASICはE−80(仮称)ミニコンの上で動いています。

そのことを確認するためにメモリダンプを実行してみました。

今ロードしたばかりの0400Hから256バイトを表示させてみました。

簡単なBASICプログラムを書いて実行してみました。


ここまでで一旦終了です。
[Ctrl]+[e]の入力でシステムブレイクします。


E−80(仮称)ミニコンの側も電源OFFしました。


ところで、Windows画面で接続を終了したときに、ログファイルをクローズしたというメッセージが表示されました。
そうなのです。
ND80ZV(ND80Z3.5)用のシステムをほとんどそのままE−80(仮称)ミニコンにロードしましたから、ログファイルの機能もちゃんと働いているのです。

ほら、この通りです。

logfile nd80zlog\02050837.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>dm 0400,04ff
0400  06 04 7F 7F 06 04 3E C3-32 00 00 21 00 08 22 01  ....>テ2..!..".
0410  00 C3 00 08 00 00 00 00-00 00 00 00 00 00 00 00  .テ..............
0420  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
0430  00 00 00 00 00 00 00 00-00 00 00 3E FF D3 98 21  ...........>.モ.!
0440  EC FF 06 0C AF 77 23 05-C2 45 04 21 00 F8 22 E2  ....ッw#.ツE.!..".
0450  FF 3E FF D3 98 31 B8 FF-CD C0 05 CD 16 06 47 E6  .>.モ.1ク.ヘタ.ヘ..G.
0460  10 CA 84 04 78 E6 0F 06-00 87 4F 21 74 04 09 7E  .ハ..x.....O!t..~
0470  23 66 6F E9 CC 04 F9 05-94 04 B8 04 9D 04 C2 04  #fo.フ.....ク...ツ.
0480  D5 04 07 05 CD B5 05 3A-EC FF B0 32 EC FF CD A1  ユ...ヘオ.:..ー2..ヘ。
0490  05 C3 51 04 2A EC FF 22-EE FF C3 A1 04 2A EE FF  .テQ.*.."..テ。.*..
04A0  23 CD AD 04 22 EE FF CD-A1 05 C3 51 04 3A EC FF  #ヘュ."..ヘ。.テQ.:..
04B0  32 ED FF 7E 32 EC FF C9-2A EE FF 2B CD AD 04 C3  2..~2..ノ*..+ヘュ.テ
04C0  A4 04 2A EE FF 3A EC FF-77 C3 9D 04 2A EE FF 22  、.*..:..wテ..*.."
04D0  E0 FF C3 F9 05 06 F7 2A-EC FF EB 2A EE FF 78 D3  ..テ....*...*..xモ
04E0  98 7C CD 7C 06 7D CD 7C-06 7A CD 7C 06 7B CD 7C  .|ヘ|.}ヘ|.zヘ|.{ヘ|
04F0  06 2B 23 7E CD 7C 06 CD-01 07 C2 F2 04 C3 0F 08  .+#~ヘ|.ヘ..ツ..テ..
>10for a=0 to 10
>20p."a=",a,"sqrt=",sqr(a)
>30n.a
>list
    10 FOR A=0 TO 10
    20 PRINT "a=",A,"sqrt=",SQR(A)
    30 NEXT A
>run
a=           0            sqrt=        0
a=           1            sqrt=        1
a=           2            sqrt=        1.41421
a=           3            sqrt=        1.73205
a=           4            sqrt=        2
a=           5            sqrt=        2.23607
a=           6            sqrt=        2.44949
a=           7            sqrt=        2.64575
a=           8            sqrt=        2.82843
a=           9            sqrt=        3
a=           10           sqrt=        3.16228

>0000 00C3 - 
リモート接続を終了しました
logfile closed at Tue Feb 05 08:44:41 2013


もっともログファイルの機能は、Windows側のソフト(zb3.exe)が持っている機能ですから、そのような動作になることは当たり前のことなのですけれど。
それにしましても、フルRAMですと、こういうことができてしまうというところに、合点していただけましたでしょうか。

Loaderについて言いますと、ご覧いただきました通り、普通の簡単なLoaderを使ってでも、このようにシステムプログラムをロードしてしまうことだってできてしまうのです。

ワンボードマイコンでCP/Mを![第310回]
2013.2.6upload

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