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
前へ
次へ
ホームページトップへ戻る