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


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

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