KL5C80A12マイコンボードの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
KL5C80A12はZ80互換の高速高性能8ビットマイクロコントローラです。
残念なことに数年前に生産中止になってしまいました。
しかし当社ではKL5C80A12を使った組込みマイコンボードはまだ健在です。
そのKL5C80A12を使ったND80Z3.5上位互換マイコンボードの製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第20回]
●RAMテスト
前回KL5C80A12のMMUについて書きましたのは、今回のRAMテストについての準備のためでした。
今製作中のKL5C80A12マイコンボードには512KBのRAMを搭載する予定です。
2回目の試作基板についても大体の動作確認も終りました。
その結果かなり直さなければならないところが出てきてしまいました。
その結果をもとにして基板配線の修正作業を行い、それが済んだらいよいよ最終的な基板を作成するつもりです。
その前に、念のために512KBRAMの回路のテストをしておきたいと考えました。
同時にMMUについて正しく理解していて使いこなせるかどうかの確認の意味でもあります。
最初はマシン語のテストプログラムを作って、前回説明しましたROMの0000〜03FFにそのプログラムを書いて、残りのエリアはRAMに指定してテストをするつもりでした。
メモリのテストはマシン語プログラムでやらざるを得ないのですけれど、ROMにマシン語のプログラムを書いてそれでテストをするというのは相当に面倒な作業です。
マシン語プログラムを使うにしても、せっかくZB3BASICシステムが動作するのですから、その上でテストをすれば最小の労力で効率よくできるはず。
と思いましたのでその線でいくことにしました。
問題は512KBのRAMをどのようにしてテストするかということです。
テストを簡単に行なうためにはマシン語プログラムとBASICプログラムを併用するのが一番です。
プログラムの説明をする前に、予備知識としてZB3BASICでのメモリマップを簡単に説明しておきます。
0000〜7FFFがシステムROMです。
8000〜FFFFがRAMです。
このうち8000〜DFFFがBASICのプログラム領域です。
E000〜FFFFはシステムの領域ですからさわれません。
BASICの変数はDFFFから前に割り当てられていきますが、変数を余り使わなければDFFF近くまでBASICのプログラムエリアとして使うことができます。
BASICのプログラムは通常は8000から後ろに割り当てられていきますが、NEWコマンドを使うことで、たとえば9000からとかA000からとかというように、前を空けることができます。
そこで今回は物理RAMを割り当てるエリアとして8000〜BFFFの16KBを確保し、マシン語プログラムはC000〜C0FFに、BASICプログラムはC100から書くことにしました。
下はその作業をしている画面です。
こちらはマシン語のプログラムリストです。
BASICプログラムからCALLされるマシン語サブルーチンになります。
2018/2/9 18:59 ndkramt1.txt END=C06F ;;; NDK RAM test ;18/2/8 2/9 ORG $C000 ; PA=$F440;&PB write data PC=$F444;bank data PE=$F448;error mark ; C000 C306C0 JP WR C003 C334C0 JP RD ;data write C006 3A44F4 WR:LD A,(PC) C009 D303 OUT (03),A C00B 3E08 LD A,08 C00D D39C OUT (9C),A C00F 110080 LD DE,$8000 C012 2140F4 WR1:LD HL,PA C015 EDA0 LDI C017 EDA0 LDI C019 EDA0 LDI C01B EDA0 LDI C01D 2140F4 LD HL,PA C020 0604 LD B,04 C022 34 WR2:INC (HL) C023 C229C0 JP NZ,WR3 C026 23 INC HL C027 10F9 DJNZ WR2 C029 7A WR3:LD A,D C02A FEC0 CP C0 C02C C212C0 JP NZ,WR1 C02F 3E00 LD A,00 C031 D39C OUT (9C),A C033 C9 RET ; ;data read &check C034 3A44F4 RD:LD A,(PC) C037 D303 OUT (03),A C039 3E08 LD A,08 C03B D39C OUT (9C),A C03D 110080 LD DE,$8000 C040 2140F4 RD0:LD HL,PA C043 0604 LD B,04 C045 1A RD1:LD A,(DE) C046 BE CP (HL) C047 C265C0 JP NZ,ERR C04A 23 INC HL C04B 13 INC DE C04C 10F7 DJNZ RD1 C04E 2140F4 LD HL,PA C051 0604 LD B,04 C053 34 RD2:INC (HL) C054 C25AC0 JP NZ,RD3 C057 23 INC HL C058 10F9 DJNZ RD2 C05A 7A RD3:LD A,D C05B FEC0 CP C0 C05D C240C0 JP NZ,RD0 C060 3E00 LD A,00 C062 D39C OUT (9C),A C064 C9 RET C065 210100 ERR:LD HL,$0001 C068 2248F4 LD (PE),HL C06B 3E00 LD A,00 C06D D39C OUT (9C),A C06F C9 RET ;end ERR =C065 PA =F440 PC =F444 PE =F448 RD =C034 RD0 =C040 RD1 =C045 RD2 =C053 RD3 =C05A WR =C006 WR1 =C012 WR2 =C022 WR3 =C029 |
これだけではわかりにくいかもしれません。
こちらはBASICプログラムです。
10 A=0 20 OUT 4,$2F 30 OUT 2,$1F 40 A%=$4567 50 B%=$0023 60 C%=$F8 70 D%=31 80 E%=0 90 PRINT "data write" 100 B%=B%+$0400 110 PRINT HEX$(C%,2),HEX$(B%,4);HEX$(A%,4) 120 USR($C000) 130 C%=C%+4 140 D%=D%-1 150 IF D%>0 GOTO 100 160 PRINT "data read check" 170 A%=$4567 180 B%=$0023 190 C%=$F8 200 D%=31 210 B%=B%+$0400 220 PRINT HEX$(C%,2),HEX$(B%,4);HEX$(A%,4) 230 USR($C003) 240 IF E%=1 THEN GOTO *ERROR 250 C%=C%+4 260 D%=D%-1 270 IF D%>0 GOTO 210 280 PRINT "end" 290 PRINT HEX$(C%,2),HEX$(B%,4);HEX$(A%,4) 300 STOP 310 *ERROR:PRINT "error!" 320 PRINT HEX$(C%,2),HEX$(B%,4);HEX$(A%,4) |
うーん。
この手のプログラムは説明しないとよくわかりませんねえ。
時間がありませんので簡単に。
システムの起動時にR3の範囲を8000〜FFFFとして、そこに物理メモリアドレスの78000〜7FFFFをを割り当てています。
BASICプログラムの先頭部分でR3の下限アドレスをC000に、R2の下限アドレスを8000に設定しました。
これで8000〜BFFFに物理メモリを割り当てる準備ができました。
このあたりのことについては[第5回]をご参照ください。
テストの方法は物理RAMの00000〜7BFFFを16KBごとに分けて順番にR2領域に割り当てて、テストデータを書き込んでいきます。
7C000〜7FFFFにはテストプログラムとシステムのエリアがあるため、今回のテスト範囲から除外します。
最後まで済んだら今度は同じようにして、最初からメモリの値が正しく書き込めているかどうかを読み出します。
書き込む値は4バイト単位で、上位1バイトが物理メモリアドレスの上位8ビット+4(計算の都合でそういう値になります)で、下位3バイトは234567を初期値として+1ずつ加算した値となります。
初期値などテストに必要な値はマシン語プログラムでも参照できるBASICの整数変数A%〜E%に入れてマシン語サブルーチンに渡します。
下はテスト結果のログです。
テストの前半では、16KBごとにR2の窓に物理メモリを割り当てるための1バイトの値と、書き込む値の初期値を表示してからマシン語サブルーチンをコールします。
テストの後半では、同じようにして値を表示したあとマシン語サブルーチンをコールして、今度は与えられた初期値をもとに、値を加算しながらメモリの内容と比較していきます。
不一致ならそこで処理を終了してE%=1にしてBASICに戻ります。
>r. data write F8 04234567 FC 08235567 00 0C236567 04 10237567 08 14238567 0C 18239567 10 1C23A567 14 2023B567 18 2423C567 1C 2823D567 20 2C23E567 24 3023F567 28 34240567 2C 38241567 30 3C242567 34 40243567 38 44244567 3C 48245567 40 4C246567 44 50247567 48 54248567 4C 58249567 50 5C24A567 54 6024B567 58 6424C567 5C 6824D567 60 6C24E567 64 7024F567 68 74250567 6C 78251567 70 7C252567 data read check F8 04234567 FC 08235567 00 0C236567 04 10237567 08 14238567 0C 18239567 10 1C23A567 14 2023B567 18 2423C567 1C 2823D567 20 2C23E567 24 3023F567 28 34240567 2C 38241567 30 3C242567 34 40243567 38 44244567 3C 48245567 40 4C246567 44 50247567 48 54248567 4C 58249567 50 5C24A567 54 6024B567 58 6424C567 5C 6824D567 60 6C24E567 64 7024F567 68 74250567 6C 78251567 70 7C252567 end 74 7C253567 break in 300 >dm@0000,00ff 0000 67 45 23 04 68 45 23 04-69 45 23 04 6A 45 23 04 gE#.hE#.iE#.jE#. 0010 6B 45 23 04 6C 45 23 04-6D 45 23 04 6E 45 23 04 kE#.lE#.mE#.nE#. 0020 6F 45 23 04 70 45 23 04-71 45 23 04 72 45 23 04 oE#.pE#.qE#.rE#. 0030 73 45 23 04 74 45 23 04-75 45 23 04 76 45 23 04 sE#.tE#.uE#.vE#. 0040 77 45 23 04 78 45 23 04-79 45 23 04 7A 45 23 04 wE#.xE#.yE#.zE#. 0050 7B 45 23 04 7C 45 23 04-7D 45 23 04 7E 45 23 04 {E#.|E#.}E#.~E#. 0060 7F 45 23 04 80 45 23 04-81 45 23 04 82 45 23 04 E#..E#..E#..E#. 0070 83 45 23 04 84 45 23 04-85 45 23 04 86 45 23 04 .E#..E#..E#..E#. 0080 87 45 23 04 88 45 23 04-89 45 23 04 8A 45 23 04 .E#..E#..E#..E#. 0090 8B 45 23 04 8C 45 23 04-8D 45 23 04 8E 45 23 04 .E#..E#..E#..E#. 00A0 8F 45 23 04 90 45 23 04-91 45 23 04 92 45 23 04 .E#..E#..E#..E#. 00B0 93 45 23 04 94 45 23 04-95 45 23 04 96 45 23 04 .E#..E#..E#..E#. 00C0 97 45 23 04 98 45 23 04-99 45 23 04 9A 45 23 04 .E#..E#..E#..E#. 00D0 9B 45 23 04 9C 45 23 04-9D 45 23 04 9E 45 23 04 .E#..E#..E#..E#. 00E0 9F 45 23 04 A0 45 23 04-A1 45 23 04 A2 45 23 04 .E#.E#.。E#.「E#. 00F0 A3 45 23 04 A4 45 23 04-A5 45 23 04 A6 45 23 04 」E#.、E#.・E#.ヲE#. >dm bf00,bfff BF00 27 35 25 7C 28 35 25 7C-29 35 25 7C 2A 35 25 7C '5%|(5%|)5%|*5%| BF10 2B 35 25 7C 2C 35 25 7C-2D 35 25 7C 2E 35 25 7C +5%|,5%|-5%|.5%| BF20 2F 35 25 7C 30 35 25 7C-31 35 25 7C 32 35 25 7C /5%|05%|15%|25%| BF30 33 35 25 7C 34 35 25 7C-35 35 25 7C 36 35 25 7C 35%|45%|55%|65%| BF40 37 35 25 7C 38 35 25 7C-39 35 25 7C 3A 35 25 7C 75%|85%|95%|:5%| BF50 3B 35 25 7C 3C 35 25 7C-3D 35 25 7C 3E 35 25 7C ;5%|<5%|=5%|>5%| BF60 3F 35 25 7C 40 35 25 7C-41 35 25 7C 42 35 25 7C ?5%|@5%|A5%|B5%| BF70 43 35 25 7C 44 35 25 7C-45 35 25 7C 46 35 25 7C C5%|D5%|E5%|F5%| BF80 47 35 25 7C 48 35 25 7C-49 35 25 7C 4A 35 25 7C G5%|H5%|I5%|J5%| BF90 4B 35 25 7C 4C 35 25 7C-4D 35 25 7C 4E 35 25 7C K5%|L5%|M5%|N5%| BFA0 4F 35 25 7C 50 35 25 7C-51 35 25 7C 52 35 25 7C O5%|P5%|Q5%|R5%| BFB0 53 35 25 7C 54 35 25 7C-55 35 25 7C 56 35 25 7C S5%|T5%|U5%|V5%| BFC0 57 35 25 7C 58 35 25 7C-59 35 25 7C 5A 35 25 7C W5%|X5%|Y5%|Z5%| BFD0 5B 35 25 7C 5C 35 25 7C-5D 35 25 7C 5E 35 25 7C [5%|\5%|]5%|^5%| BFE0 5F 35 25 7C 60 35 25 7C-61 35 25 7C 62 35 25 7C _5%|`5%|a5%|b5%| BFF0 63 35 25 7C 64 35 25 7C-65 35 25 7C 66 35 25 7C c5%|d5%|e5%|f5%| >/exit 0000 00C3 - リモート接続を終了しました logfile closed at Sat Feb 10 08:47:04 2018 |
テスト終了後に参考までにDM@コマンドでROMの裏に置かれたRAMの0000〜00FFの値を表示してみました。
裏のRAMの0000番地には物理RAMの00000が置かれています。
そのあとで、テスト終了直後のBF00〜BFFFの内容も表示しました。
こちらは普通のDMコマンドです。
RAMの8000〜BFFFには最後に割り当てられた物理RAMの78000〜7BFFFが見えています。
前回はRAMを0000に割り付けることはできない、と書きましたが、そのほかのアドレスに割り当てることは自由にできます。
たとえば今回R2の窓(8000〜BFFF)に物理RAMのアドレス00000〜03FFFを割り当てるには、R2の物理レジスタ(I/Oアドレス03)にF8を書けばよいのです。
時間がなくなってしまいましたので、そのあたりのことについては、[第6回]をご参照ください。
なお上のログでDM@コマンドで0000〜を読むと物理RAMの00000〜の内容が表示されたのはMMUの機能ではなくて(MMUではRAMを0000に割り当てることはできない)、ハード回路によってROMとRAMのバンク切換えを行なっているためです。
KL5C80A12マイコンボードの製作[第20回]
2018.2.12upload
前へ
次へ
ホームページトップへ戻る