KL5C80A12マイコンボードの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
KL5C80A12はZ80互換の高速高性能8ビットマイクロコントローラです。
残念なことに数年前に生産中止になってしまいました。
しかし当社ではKL5C80A12を使った組込みマイコンボードはまだ健在です。
そのKL5C80A12を使ったND80Z3.5上位互換マイコンボードの製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第7回]
●最上位4ビットの表示
現在試作作業中の新ND80Kマイコンボードには7セグメントLEDを9桁実装する予定になっています。
こちらは[第2回]でお見せした試作評価中の完成品です。
ND80Z3.5ではアドレス表示4桁、データ表示4桁の8桁です(TK−80も同じです)。
表示できるアドレスは0000〜FFFFですから4桁表示で間に合います。
それに対して、すでに説明しておりますようにKL5C80A12は8ビットCPUですが、内蔵のMMUの働きで外部に最大512KBまでのメモリを実装することができます。
そのときのメモリアドレスは途中に穴が開くものの、00000〜FFFFFの範囲になります。
とはいえプログラムで直接アクセスできるメモリ空間は8080やZ80と同じ0000〜FFFFです。
そのことから考えれば、今回の新マイコンボードでも、アドレス表示は今までと同じ4桁でよい、とも言えます。
しかし、せっかくのトレーニングボードですし、昔のTK−80と同じようにキーボードから16進数を入力することで、アドレスやデータをLEDに表示させることができるのですから、せっかく実装できるメモリアドレスが16進数5桁ならば、やっぱり5桁表示させたいと考えて、とりあえず試作版ではそのような設計にしました。
ですけれど、どのようにしてその5桁を表示し、そしてそのときのメモリの値を読み出して表示し、またはそのメモリアドレスに値を書き込めばよいのか、そこのところは全く考えていませんでした。
たとえばTK−80の場合、アドレス4桁をLEDの左4桁のアドレス表示部に表示するには、下のように操作します。
キーからの入力は1桁単位で行なわれ、その入力された1桁の16進数はまずLEDの右端に表示され、次の1桁の数が入力されると、先に入力されていた全部の桁が左に1桁分シフトして、空いた右端に新しく入力した数が入って表示されます。
右の4桁の表示が全部埋まってさらにキー入力をするとデータ表示部(LEDの右4桁)からあふれた数値は消えてしまいます。
このままでは入力した値を左側のアドレス表示部に表示させることはできません。
まず最初にそのようにして右側のデータ表示部に4桁の数値を入力表示させたあと、[ADRS SET]キーを押すと、データ表示部にあった4桁の値が左側の4桁のアドレス表示部に移動してアドレスとして表示されます。
なかなかにうまくできた仕組みですが、その仕組みのままでは置数が4桁なので、アドレス表示部を5桁にしても最上位の1桁を表示させることはできません。
現行の仕組みをそのままにしておいて、なるべく簡単に最上位の1桁を表示させることはできないものか、この2〜3日、そのことを考えていました。
簡単かどうかは皆様の評価におまかせするとしまして、これならばなんとかいけるのでは、という案が浮かびましたので、さっそくそのようにプログラムしてみました。
起動直後の表示です。
アドレス表示はF0000です。
これにはちょっと説明が必要です。
[第4回]で、メモリマップとしてはマキシマムモードでいきます、と書きました。
そこで書きましたように、内蔵の512バイトを除けば、メモリアドレスは00000〜7FFFFになります。
通常00000はROMのアドレスですから、ユーザーが使うエリアとしては、70000を表示させて起動したほうが適当と考えています。
実は。
マキシマムモードが適当ということに落ち着いたのは、試作基板が出来てきて、そこで試行錯誤したあとでのことでしたので、今ここで見ていただいている試作基板のシステムはマキシマムモードではなくてノーマルモードなのです。
そのほうが小容量のROMとRAMを分けて実装できるので、簡便だからです。
こちらが現行試作基板のメモリマップです。
R1、R2、R4は無効にして、R0が0000〜0FFF、R3が1000〜FFFFの範囲になっています。
この構成ではROMは00000〜1FFFFの128KB、RAMはE0000〜F0000の128KBが最大実装メモリになります。
RAMは628128を実装していますが、ROMはまだテスト段階なので簡単に扱える27C256を実装しています。
R3ブロックの物理ベースアドレスはF0を指定していますから、図のように論理アドレス1000〜FFFFがRAMのF1000〜FFFFFに対応しています。
0000〜0FFFはROMです。
現在のそのようなマップから、リセット後の最上位アドレスとして[F]を表示するように考えました。
このところは最終的にマキシマムモードのシステムとなった段階で[7]を表示させるつもりです。
上のリセット直後の状態で、
[8][0][0][0][ADRS SET]とキー入力したあとの表示です。
このときデータ表示部の右2桁に表示されている12はメモリアドレスF8000の実際の値です。
これは上の図で物理メモリアドレスと論理メモリアドレスが一致していますから、当たり前のことなのですが。
ところが、これから当たり前ではないことが起こります。
[E]を入力しました。
このあと、マジックです。
[E]が最上位桁に表示されました。
どのようにに操作したかは、今は内緒にしておきましょう。
[READ INC]キーを押しました。
右端の2桁に表示されたCDはメモリアドレスE8001の実際の値です。
[READ DEC]キーを押しました。
右端の2桁に表示されたABはメモリアドレスE8000の実際の値です。
アドレスの下位4桁のみを見れば、さきほどのF8000と同じですが、表示されるメモリの値は両者で異なっていますから、そのことから今回は表示されたアドレスの通りのE8000、E8001の値が表示されている、ということが本当らしいぞ、と言えそうです(事実その通りなのです)。
実はここで見本としてお見せした、EXXXX、FXXXXの範囲だけではなくて、メモリが実装されているかどうかに関係なく00000〜FFFFFの全範囲のアドレスを設定することができるのです。
本日は時間がなくなってしまいましたので、そのあたりのことについては次回に説明することにいたします。
KL5C80A12マイコンボードの製作[第7回]
2016.12.23upload
前へ
次へ
ホームページトップへ戻る