2016.12.28
前へ

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


KL5C80A12マイコンボードの製作

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
KL5C80A12はZ80互換の高速高性能8ビットマイクロコントローラです。
残念なことに数年前に生産中止になってしまいました。
しかし当社ではKL5C80A12を使った組込みマイコンボードはまだ健在です。
そのKL5C80A12を使ったND80Z3.5上位互換マイコンボードの製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第10回]


●物理メモリR/Wプログラム

KL5C80A12ではMMUの働きによって、CPUの外部に接続した64KBを越えるメモリ範囲をアクセスすることができます。
CPUが直接アクセスできる64KBの論理的なメモリ範囲をいくつかに分割して、それぞれの範囲をいわば窓にして、そこに外部の物理メモリをはめ込んで、それにアクセスするという方法です。
その働きは裏方のようなもので普通は意識されることはありません。
しかし64KBを越えるメモリをアクセスするようなプログラムを作った場合などに、ダイレクトに物理メモリアドレスにアクセスして確認できると便利なこともあるのではないか、と思います。
前回はその準備として、物理メモリアドレス(16進数5桁)を7セグメントLEDのアドレス表示部(LEDの左5桁)に表示できるようにしました。
今回はそれを土台にして、表示されたアドレスの通りの実メモリアドレスにアクセスして、その値を読み出し、また書き込むことができるように、モニタプログラムの変更を行ないます。
前回と同様、その変更は0800〜のND80Zモニタプログラムに対して行ないます。
変更が必要なのは、ADRSSET(ADDRESS SET)、READINC(READ INCREMENT)、READDEC(READ DECREMENT)、WRITEINC(WRITE INCREMENT)の各処理ルーチンです。
ND80Zモニタプログラムの中でそれらの処理ルーチンはちょうど一箇所にまとまっていますから、下にその部分のリストをまとめてお見せします。

              ;
              ; ADDRESS SET
09A9 2AECFF    ADST:LD HL,(DATAL)
09AC C3B309         JP RINC2
              ;
              ; READ INC
09AF 2AEEFF    RINC:LD HL,(ADRSL)
09B2 23             INC HL
09B3 CDBF09   RINC2:CALL DTSET
09B6 22EEFF         LD (ADRSL),HL
09B9 CD200E   RINC3:CALL ADDSP
09BC C3BD08         JP START2
              ;
09BF 3AECFF   DTSET:LD A,(DATAL)
09C2 32EDFF         LD (DATAH),A
              ;high address check 12/22
09C5 54         LD D,H
09C6 5D         LD E,L
09C7 7C         LD A,H
09C8 FE10       CP 10
09CA 3AB7FF     LD A,(LEDHI)
09CD D2DA09     JP NC,HI10
09D0 B7         OR A
09D1 CAE709     JP Z,DTSET1
09D4 D601       SUB 01
09D6 010010     LD BC,$1000
09D9 09         ADD HL,BC
09DA D305     HI10:OUT (05),A
09DC 46         LD B,(HL)
09DD 3EF0       LD A,F0;******************
09DF D305       OUT (05),A
09E1 78         LD A,B
09E2 62         LD H,D
09E3 6B         LD L,E
09E4 C3E809     JP DTSET2
              ;
09E7 7E       DTSET1:LD A,(HL)
09E8 32ECFF   DTSET2:LD (DATAL),A
09EB C9             RET
              ;
              ; READ DEC
09EC 2AEEFF    RDEC:LD HL,(ADRSL)
09EF 2B             DEC HL
09F0 C3B309         JP RINC2
              ;
              ; WRITE INC
09F3 2AEEFF    WINC:LD HL,(ADRSL)
09F6 3AECFF         LD A,(DATAL)
09F9 47         LD B,A
              ;high address check 12/23
09FA 54         LD D,H
09FB 5D         LD E,L
09FC 7C         LD A,H
09FD FE10       CP 10
09FF 3AB7FF     LD A,(LEDHI)
0A02 D2110A     JP NC,WHI10
0A05 B7         OR A
0A06 CAAF09     JP Z,RINC;***not write
0A09 D601       SUB 01
0A0B 4F         LD C,A
0A0C 7C         LD A,H
0A0D C610       ADD A,10
0A0F 67         LD H,A
0A10 79         LD A,C
0A11 D305     WHI10:OUT (05),A
0A13 70         LD (HL),B
0A14 3EF0       LD A,F0;******************
0A16 D305       OUT (05),A
0A18 62         LD H,D
0A19 6B         LD L,E
0A1A C3AF09     JP RINC

何をやっているのか、ちょっとわかりにくいかもしれません。
私としてもちょっと説明しにくくて、もどかしい思いがあります。
でももうあと数日で今年も終ってしまいます。
とにかくやらなくてはいけないことと書かなくてはいけないことを山積したまま年を越してしまいそうです。
ですので、ここのところはざっと簡単に説明するだけにします。
よくわからないなあ、という方はお正月のお休みにじっくり考えてみてください。

もとのプログラム部分に追加したのは
 ;high address check
の部分です。

ここではまずアドレスの下位4桁(0000〜FFFF)のうちの上位2桁が10Hよりも大きいか小さいかを比較しています。
これはそのアドレスがR3(RAMの窓)の範囲なのか、R0(ROMの窓)なのかを判定しているのです(R3とR0については[第7回]参照)。
Hの値が10以上ならばそのアドレスはR3の物理ベースアドレスを変更するだけで、そのまま読み書きできるアドレスなので、R3の物理ベースアドレスレジスタ(I/Oアドレス05)に5桁目の値をOUTします。
読み書きが済んだらすぐに元通りに戻すところがポイントです。
この間レジスタだけでメモリを使っていないことに注目してください。

最初にちょっと困ったなあと思ったのは、下位4桁が0000〜0FFFのときです。
ここはR0の窓に相当するところなのですが、R0は下限が物理アドレス00000に固定されてしまっていますから、この窓に10000〜や20000〜を持ってくることはできません。
ということになると、どうしてもR3の窓を使うしかありません。
しばらく悩んだのですが、00000〜00FFF以外の、下位4桁が0000〜0FFFの範囲の物理メモリをR3の窓に持ってくるには、5桁の物理アドレスのうち上位2桁を−1した値をR3の物理ベースアドレスとして与えたうえで、下位4桁を+1000すればよいことに気が付きました。

うーん。
自分ではよくわかっているのですが、どうもうまく説明できません。
下の図で考えてみてください。

E0000〜E0FFFをR3の窓の1000〜1FFFとして読み書きする場合です。
R3の1000〜1FFFに物理メモリのE0000〜E0FFFを持ってくるには、R3の0000をDF000に合わせればよいことがわかります(わかりますでしょうか?)。

KL5C80A12マイコンボードの製作[第10回]
2016.12.28upload

前へ

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