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

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

[第300回]


●IPL(Initial Program Loader)

このところずっと紹介を続けております8ビットミニコンE−80(仮称)にはプログラムROMがありません。
CPUはZilog社のZ8S180でZ80コアに周辺ペリフェラル機能を合体させた68pinのPLCCタイプを使っております。
Z80が直接アクセスできるメモリアドレスは0000〜FFFFの64KB(65536バイト)ですが、内蔵のMMU(Memory Management Unit)によって最大1MB(1048576バイト)のメモリ空間(00000〜FFFFF)をアクセスすることができます。
E−80(仮称)ミニコンのメインボードにはその半分512KBのRAMが搭載されています。
それだけ大きなメモリを積んでいるにもかかわらず、ROMは積んでおりません。

じつはY様からこの企画のご提案をいただいた段階では、IPL(Initial Plogram Loader)を書き込んだROMを内蔵するシステムになっておりました。

●ROMとRAM

皆様ご存知とは思いますが、ROMはRead Only Memoryの略で、これは文字通り「読み出すことだけが出来て書き込むことができない」メモリです。
それに書き込むためには通常は専用のツールか回路および書き込みプログラムが必要になります。
RAMはRandom Access Memoryの略語です。
その昔にはROMに対してRWM(Read Write Memory)という用語もあったのですが普及しませんでした。
ROMだってれっきとしたRandomにAccessできるMemoryなのですけれど、ROMに対する言葉としてRAMが使われるのが一般的です。
言葉本来の意味としては、RAMにはROM(Read Only)に対するようなRead/Writeの意味はありません。
もともとデータなどを記憶する補助記憶装置としては紙テープ装置や磁気テープ装置などが主体で、これらの装置の総称として、シーケンシャルアクセス記憶装置(Sequential Access Memory、SAM)という用語が使われ、それに対してランダムにアクセスできるメモリというところから、RAMという言葉が使われるようになったのでは、と思われます。

●RAMとIPL

ここで、まずはそのRAMとIPLの関係について説明をしておくことにいたします。
IPLを使う前提は、E−80(仮称)ミニコンのように、主メモリがRAMで構成されていることです。

たとえばTK−80やND80ZV(ND80Z3.5)などは、モニタプログラムが最初からROMに書き込まれていますから、起動と同時にそのROMのプログラムをCPUが実行することでシステムが動作します。
この場合には、RAMはシステムのワークエリアやユーザプログラムおよびデータエリアとして使われます。
RAMは大きいに越したことはありませんが、必要最小限のRAMでもボード機能はまともに動作します。
実際にTK−80の場合にはRAMはわずか512バイトしか実装していませんでした。
まあモニタプログラムも小さくて、それを書き込んだROMもたったの1KBだったのですけれど。
いずれにしましても、キーボード入力やLED表示といった基本的なプログラムが最初からROMに書かれていますから、パワーONと同時に使うことができるようになります。
そういうシステムにはIPLは不要です。

そのようなモニタROMあるいはシステムROMが無くて、主メモリがRAMだけということになりますと、それはキーボード入力とかLED表示というようなシステムの大本になる基本的な機能プログラムもパワーON直後には実行することができない、ということを意味します。
CPUはプログラムがあってこそ初めて動作することができます。
最初からRAMだけということになりますと、そこにはプログラムは書かれておりません。
厳密に言いますと、メモリですから何かは書かれていますが、プログラムのように意味がある命令としては書かれてはいません。
そういうことになりますと、何らかの手段によって、RAMにプログラム(当然マシン語コードになります)を書き込まなくてはなりません。

●IPLのないシステム

お話の順序といたしまして、まずはIPLのないシステムについて説明をいたします。

システムモニタROMがなくて、RAMだけというシステムでも、なんらかの手段でRAMにプログラムを書き込む必要があります。
そこでフロントパネルが必要になってきます。
CPUを停止させておいて、フロントパネルのスイッチ群を操作して、メモリアドレスをセットし、1バイトずつメモリにプログラムを書き込んでいきます。
アドレス設定スイッチやデータ設定スイッチは一般的には1ビットに1個のスイッチが対応します。
つまりアドレスやデータは二進法の通りのビット表現のまま設定をします。
現在設定されているメモリアドレスやメモリから読み出したそのアドレスの値は、やはり同じように二進数でビットごとにLEDに表示されます。
通常は1のピットが点灯し、0のビットは消灯します。

ここではE−80(仮称)ミニコンについて説明をしておりますから、フロントパネルにつきましてもE−80(仮称)ミニコンのフロントパネルを使って説明をいたします。
といいましてもまだ実物は試作品だけです。
この写真は試作品のフロントパネルです。

右にありますREAD、READ NEXT等のスイッチはテスト作業のため外してあります。
以下の説明におきましては、この写真を念頭においてお読みください。

あ。
だんだんIPLから離れていってしまうようですが、こんな調子で脱線してしまいますのはいつものことでありますので、ここは我慢していただきまして、しばしおつきあいをお願いいたします。

●サンプルプログラム

それでは、RAMだけでROMをもたないシステムでは、どのようにしてプログラムをRAMに書き込んで、そしてそれを実行するのか、ということについて説明をいたします。

例として以下のプログラムをCPUに実行させてみることにします。

0000 DBFF    LOOP:IN A,(FF)
0002 D3FF         OUT (FF),A
0004 C30000       JP LOOP

たったこれだけの短いプログラムですが、プログラムがCPUによって正しく実行されていることを確かめるためには、なかなかにいいプログラムです。

E−80(仮称)ミニコンのフロントパネルには、すでに説明をしてきました、メモリ読み出し(READ、READ NEXT)、書き込み(WRITE、WRITE NEXT)やステップ操作などの機能のほかにも、簡単な入出力装置としての機能も備わっています。

通常はアドレス設定に使われるパネル左側に配置された上位8ビット(A15〜A8)の設定スイッチは、CPUがプログラムを実行している時には、8ビットのデータ入力スイッチとして機能します。
このスイッチにはI/OアドレスのFFHが割り当てられています。

またフロントパネル左上にはプログラムでのデータ出力用に独立した8ビットのLEDがあって、これにもI/OアドレスのFFHが割り当てられています。
同じFFHですがIN命令を実行したときにはスイッチから設定値が入力され、OUT命令を実行したときにはデータ出力用のLEDにAレジスタの値が出力されます。

●プログラム入力の手順

それでは上のプログラムをフロントパネルを使ってRAMに書き込んでいく手順を説明いたします。
電源を入れたらまず最初にSTOPスイッチを押して、CPUを停止させます。
今回のプログラムはアドレスの0000Hから順に書き込んでいきますから、アドレス設定スイッチは使う必要はありません。

1)RESETスイッチ(CPU RESET)を押します。
アドレスLEDが0000を表示して、RAMのアドレス0000Hが選択されていることが示されます(このときデータバスLEDにはRAMの0000Hの内容が表示されます)。

2)データスイッチ(アドレス下位8ビットA7〜A0の設定スイッチがデータ設定スイッチD7〜D0を兼ねています)を操作して最初の命令コード(DBH)を設定します。
DBHは二進数表現では 11011011 になります。
そこでデータ入力スイッチは ON ON OFF ON ON OFF ON ON というように設定します。

3)WRITEを押します。
データバスLEDにはデータスイッチに設定した値DBHが表示されます(アドレスLEDの表示は0000Hのまま変わりません)。

4)次の命令コード(この場合には命令のオペランドですが)FFHをデータスイッチに設定してWRITE NEXTを押します(次からはデータスイッチ設定後はWRITE NEXTを押します)。
アドレスLEDの表示が0001Hになって、データバスLEDにはデータスイッチに設定した値FFHが表示されます。

5)続いて、D3H、FFH、C3H、00H、00Hまで順に入力します。

6)最後の00Hを入力したら、もう一度RESET(CPU RESET)を押します。
アドレスLEDの表示が0000Hになります。

ここで入力したプログラムを確認することもできます。
データバスLEDには、アドレス0000Hの内容DBHが表示されているはずです。
ここでREAD NEXTを押すと、押すたびにアドレスが+1されて、そのアドレスのメモリ内容がデータバスLEDに表示されます。

●プログラムの実行

プログラムを実行するには、まずRESETスイッチ(CPU RESET)を押してアドレスを0000Hにしておいてから、RUNスイッチを押します。

アドレスLEDやデータバスLEDはぼんやりと光っているだけで、本当にプログラムが正しく実行されているのかどうか、そこを見ただけではわかりませんが、フロントパネル左上のデータ出力用LED(PROGRAMMED OUTPUT)には、プログラム実行中のデータ入力スイッチ(アドレス設定用スイッチの左半分A15〜A8、PROGRAMMED INPUT)の設定内容がそのまま表示されます。
ここでPROGRAMMED INPUTスイッチを操作すると、その値が直ちにPROGRAMMED OUTPUTの表示に反映されて、正しくプログラムが実行されていることがわかります。

●プログラム入力〜実行までの写真

せっかくですので、上で説明をしましたプログラムの入力〜実行までの様子を写真でお見せすることにいたします。

最初にリセットしました。

アドレス表示LED(A15〜A0)は全部消灯して現在のアドレスが0000Hであることを示しています。
データバス表示LEDにはメモリの0000H番地の現在の値(3CH)が表示されています。
下側に並んでいるアドレス設定スイッチは、何も影響していません。
左上のデータ出力用LED(PROGRAMMED OUTPUT)にはFFHが表示されていますが、これはたまたまこのように表示されているだけで、いまのところここに何が表示されていても意味はありません。

パネルスイッチの右側8個はアドレスの下位8ビットの設定とデータ(命令コード)設定を兼用しているスイッチです。
そこにDBHを設定してWRITEを押しました。

データバス表示LEDにDBHが表示され、その値がメモリの0000H番地に書き込まれたことを示しています。

データスイッチにFFHを設定してWRITE NEXTを押しました。

データバス表示LEDにFFHが表示され、その値がメモリの0001H番地に書き込まれたことを示しています。

データスイッチにD3Hを設定してWRITE NEXTを押しました。

データバス表示LEDにD3Hが表示され、その値がメモリの0002H番地に書き込まれたことを示しています。

データスイッチにFFHを設定してWRITE NEXTを押しました。

データバス表示LEDにFFHが表示され、その値がメモリの0003H番地に書き込まれたことを示しています。

データスイッチにC3Hを設定してWRITE NEXTを押しました。

データバス表示LEDにC3Hが表示され、その値がメモリの0004H番地に書き込まれたことを示しています。

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

データバス表示LEDが全部消えて、00Hがメモリの0005H番地に書き込まれたことを示しています。

もう一度WRITE NEXTを押しました。

00Hがメモリの0006H番地に書き込まれました。

ここでRESET(CPU RESET)を押しました。

アドレス表示LEDが全部消灯して、CPUのプログラムカウンタがクリアされて、アドレスが0000Hに設定されたことがわかります。
データバスLEDにはアドレス0000Hのメモリの内容DBHが表示されています。

RUNスイッチを押しました。

アドレス表示LEDがぼんやり光っています。
それによってプログラムを実行中であることがわかります。
左上部の8個のLED(PROGRAMMED OUTPUT)には、左下の8個のスイッチ(PROGRAMMED INPUT)に設定した値(56H)が表示されています。

この状態(プログラムを実行中の状態)のままで、PROGRAMMED INPUTスイッチの設定値を変えてみました。

スイッチを78Hにしたところ、PROGRAMMED OUTPUTにも同じ値が表示されました。

ところで、このように写真を撮って、説明を書きながら写真を眺めていましたら、ちょっとおかしなことに気が付いてしまいました。
それはアドレス表示LEDの上位A15〜A8の表示です。
今回のプログラムはアドレス0000H〜0006Hという短いものですから、それを実行したときのアドレスLEDも本当はその範囲しか光らないはずです。

が。
よく考えて見ますと、IN A,(FF)とOUT (FF),Aを実行するときは、アドレス下位8ビットにはFFHが出力されますし、リフレッシュも禁止していませんから、下位アドレスにはリフレッシュアドレスも出力されます。
ということで、下位8ビットがぼんやり光っていることは納得できました。

しかし上位8ビットは?
ここは消灯してしかるべきはず、と考えたのですが。
どうもスイッチの設定と同じ表示になってしまうように見えます。

さては回路に何かミスが?
回路を調べてみたのですが、ミスはありませんでした。
アドレス設定スイッチはデータバスにはつながっていますがアドレスバスにはつながっていないことを確認しました。

それならばなぜ?
なんとなく赤LEDだけが連動しているように見えますが、これは青LEDと赤LEDの輝度の違いで、近くでよく見ますと青LEDもスイッチの設定値に連動して薄く光っていることがわかりました。

うむむむ。
なぜか?

あっ。
そういうことか。
しばらく考えて、やっと納得いたしました。
回路の誤動作でも、設計ミスでもなんでもなかったのです。
これは当たり前のことでした。

さて。
皆様はお分かりになりましたでしょうか?
Z80に相当詳しい方でしたならば、お分かりかと思います。

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

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