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

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第22回]

●ROM/RAM32KB切り換え回路

今回は、前回お見せしましたND80ZVのCP/M用RAM増設(およびROM/RAM切り換え)回路について説明をいたします。
下は増設メモリ基板として使ったZ80ボードのメモリ回路部分です。
この部分をそのまま利用します。



図では74LS32となっていますが、ここに74HC32を使います。
ちょうど都合が良いことに、ゲートの出力がROMのOEとRAMのCEに入っています。

ここで、「え?なぜROMのOEなの?」と思われるかも知れません。
実はこの図のように、CEをGNDに落としておいて、OEをコントロールすると、アクセスタイムがうんと短くなるのです。
昔はアクセスタイムが速いROMは高価で入手が難しくて苦労しました。
そこでこのような回路を考えたのです。
平均的な消費電流は若干増えるかも、と思いますが、電池駆動でもない限り問題にはなりませんでしょう。
参考までに、27C256のデータシートをお見せしましょう。


[出典]STMicroelectronics社 M27C256B datasheet

tELQVがCEからのDATA出力で、tGLQVがOEからのDATA出力です。
アクセスタイムが半分ほどに縮まります。
もっとも最近はアクセスタイムが十分過ぎるほど短いものが普通に入手できますから、このような回路にするほどの必要はなくなりました。

●改造前のND80ZV回路図

こちらは今回の改造をする前のND80ZVの回路図です。



何かいい方法はないものかと回路図を確認していましたら、ちょうど74HC175(IC22)のフリップフロップが1回路遊んでいることに気がつきました。
これを利用しない手はありません。

●改造後のND80ZV回路図

ということで、遊んでいた74HC175のフリップフロップをROM/RAM切り換え回路に利用することにしました。
こちらは改造後の回路図です。



フリップフロップの入力は、D3に接続します。
この回路はキー入力回路のキーライン選択のための出力回路です。
もともとND80ZVのモニタプログラムではD0〜D2までしか使っていませんから、このように改造をしても、ND80ZVの動作には全く影響はありません。

リセットまたはパワーONしたときに必ずROMが選択されるように、74HC175のRES端子をRESET信号に接続しておきます。

以上の改造を行なった結果、増設基板上のROM/RAMが選択されるようになります。
増設基板の回路とつなげて、その部分の回路を下に示します。



[2012.2.7注記]
メモリ増設基板として利用したZ80ボード基板(上図右側の破線で囲んだ部分)の内部でRAMWRが74HC32のpin4にも配線されていることに気が付きましたので、回路図を新しいものに差し換えました[注記ここまで]

I/Oアドレス9CにD3が0(ビット3=0)になるような値を出力すると、ROMが選択され、D3=1(ビット3=1)になるようなデータを出力するとRAMが選択されます。

●モニタROMは書き換えが必要

これでハード的には全く問題はないはずなのですが、残念ながらソフトウェアも変更が必要でした。
上のように改造をして、増設ボードを取り付けて電源ONしてみましたら、まともに動作しませんでした。

さては?
と思ってモニタROMを調べてみましたら、残念なことに、キー入力ルーチンでキーアクセスするときに、D3=1になるデータを出力しておりました。
ここをD3=0に変更しなければなりません。
変更部分は次の6箇所です。

024B FE→F6
0258 FD→F5
0265 FB→F3
064B FE→F6
0658 FD→F5
0665 FB→F3

モニタROMの書き換えは、ここで紹介しております増設基板のパーツや増設メモリを頒布するときに、書き換えサービスとして行なうつもりですので、いましばらくお待ちください(Windows側のプログラムも仮想フロッピディスクのための変更が必要になりますので)。

●動作を確認してみました

さて、そのようにモニタROMも書き換えてみましたところ、増設基板を実装した状態でも、改造前と同じようにND80ZVが起動するようになりました。
それが前回お見せした写真です。



勿論増設基板を外して、もとの通りにND80ZVの本体のICソケットにROMを戻して、改造前と同じように起動することも確認しました。

さらに、増設基板を実装してND80ZVを起動して、USBでWindowsパソコンと接続して、改造前と全く同じように、ZB3BASICを起動することもできました。
これでROMがまともにアクセスできていることは確認できました。

しかし。
はたしてRAMはどうなのか?
RAMもちゃんとアクセスできているかどうかを簡単にテストしてみたいものです。

そこで、次のようなプログラムを作りました。

2012/1/31  16:38  RAM0TST.TXT
END=801C
              ;;;ND80Z3 ROM/RAM BANK TEST
              ;12/1/31
              ;
                    ORG $8000
              ;
8000 210000   LD HL,$0000
8003 3EFF     LD A,FF
8005 D39C     OUT (9C),A
8007 75       LOOP:LD (HL),L
8008 2C       INC L
8009 C20780   JP NZ,LOOP
800C 110090   LD DE,$9000
800F 7E       LOOP2:LD A,(HL)
8010 12       LD (DE),A
8011 1C       INC E
8012 2C       INC L
8013 C20F80   JP NZ,LOOP2
8016 3E00     LD A,00
8018 D39C     OUT (9C),A
801A C33310   JP $1033
              ;END
LOOP         =8007  LOOP2        =800F  

たったこれだけの簡単なプログラムです。
最初に9CにFFを出力することでRAMを選択して、アドレス0000〜00FFに、00〜FFを書き込みます。
次に、今書き込んだはずの0000〜00FFの内容を読み出して、アドレス9000〜90FFにコピーします。
最後に9Cに00を出力することで、ROMに切り換えてから、ZB3BASICのエントリポイント(1033)に戻ります。
Z80にはLDIRという命令がありますが、そんなものを敢えて使わなくても、8080でお馴染みの方法を使ったほうがわかりやすくてよいと思います。

このプログラムはND80ZVに附属のZ80アセンブラ(ZASM.COM)でアセンブルしました(CP/M作業で使っているZASM.EXEではありません)。

このプログラムを実行した結果をログファイルで示します。

logfile nd80zlog\01311639.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>/LD RAM0TST.BIN,8000
loading RAM0TST.BIN ...001d(29)bytes loaded,from 8000 to 801C
>JP 8000
>D.,9000,90FF
9000  00 01 02 03 04 05 06 07-08 09 0A 0B 0C 0D 0E 0F  ................
9010  10 11 12 13 14 15 16 17-18 19 1A 1B 1C 1D 1E 1F  ................
9020  20 21 22 23 24 25 26 27-28 29 2A 2B 2C 2D 2E 2F   !"#$%&'()*+,-./
9030  30 31 32 33 34 35 36 37-38 39 3A 3B 3C 3D 3E 3F  0123456789:;<=>?
9040  40 41 42 43 44 45 46 47-48 49 4A 4B 4C 4D 4E 4F  @ABCDEFGHIJKLMNO
9050  50 51 52 53 54 55 56 57-58 59 5A 5B 5C 5D 5E 5F  PQRSTUVWXYZ[\]^_
9060  60 61 62 63 64 65 66 67-68 69 6A 6B 6C 6D 6E 6F  `abcdefghijklmno
9070  70 71 72 73 74 75 76 77-78 79 7A 7B 7C 7D 7E 7F  pqrstuvwxyz{|}~
9080  80 81 82 83 84 85 86 87-88 89 8A 8B 8C 8D 8E 8F  ................
9090  90 91 92 93 94 95 96 97-98 99 9A 9B 9C 9D 9E 9F  ................
90A0  A0 A1 A2 A3 A4 A5 A6 A7-A8 A9 AA AB AC AD AE AF  。「」、・ヲァィゥェォャュョッ
90B0  B0 B1 B2 B3 B4 B5 B6 B7-B8 B9 BA BB BC BD BE BF  ーアイウエオカキクケコサシスセソ
90C0  C0 C1 C2 C3 C4 C5 C6 C7-C8 C9 CA CB CC CD CE CF  タチツテトナニヌネノハヒフヘホマ
90D0  D0 D1 D2 D3 D4 D5 D6 D7-D8 D9 DA DB DC DD DE DF  ミムメモヤユヨラリルレロワン゙゚
90E0  E0 E1 E2 E3 E4 E5 E6 E7-E8 E9 EA EB EC ED EE EF  ................
90F0  F0 F1 F2 F3 F4 F5 F6 F7-F8 F9 FA FB FC FD FE FF  ................
>/EXIT
0000 00C3 - 
リモート接続を終了しました
logfile closed at Tue Jan 31 16:41:48 2012


ZB3BASICを起動して、RAMテストプログラム(RAM0.BIN)を8000〜にロードしたあと、JP 8000[Enter]で実行しました。
実行は瞬時に完了して、ZB3BASICに戻ってきます。
正しく実行されたかどうかを確かめるために、DMコマンドで9000〜90FFのRAMの中味を表示させてみました。

おお。成功です。

もしRAMが正しくアクセスできなかったとすると、0000〜00FFはROMか、あるいは何も無い(読み出せばFF)か、ということになると思いますが、いずれの場合でも、9000〜90FFは上のダンプリストのようにはなりません。
9000〜90FFに、上のように00〜FFが書き込まれたということは、増設したRAMが0000〜のアドレスでアクセスできたからに間違いはありません。

今回の改造によって、0000〜7FFFのエリアをRAMにすることができるだけではなくて、アドレス9CにD3=0またはD3=1のデータを出力することによって、その領域をRAMとしても、ROM(ND80ZシステムROM)としてもアクセスできるようになりました。

ということは。
いつでも(つまりCP/Mを実行中にでも)、注意深く行なうならば、0000〜7FFFのZB3BASICのシステムプログラムをCALLして、それを利用することが可能だということになります。
これは有り難いことです。
どのくらい有り難いか、ということにつきましては、おいおい説明をしていくことで、きっとご理解いただけることと思います。

さて、次回は改造作業の実際について、写真をお見せしながら、詳しく説明をしていくことにいたします。

ワンボードマイコンでCP/Mを![第22回]
2012.2.1upload
2012.2.7注記(回路図差換)

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