Z80でDRAMを動かした

一般社会で何の断りもなくメモリといったらDRAMを指す。電子工作ではもっぱらSRAMが使われるが、一種の嗜みとして、いつかDRAMを動かそうと思っていた。振り返れば、このブログの先頭から6回はDRAMを語り、DRAMコントローラの力を借りて、よく理解しないまま4164を動かしている。今度はTTLで動かして、十分に理解したことを証明したい。漠然とそんな風に考えていた2年前、日米商事でお誂え向きのDRAM、4416と出会い、構想が実現へ動き出した。これ、Z80と組み合わせれば比較的簡単に動くから。

nichibai_4416_p

4416の相方にZ80を選んだ理由は、当初、ただDRAMリフレッシュ機能を持つというだけだったが、実際は4416のほうでもZ80の欠点を補完する形になっていて相性抜群。同じ世代の4164と比べると、最低2個でデータバスを埋められるし、OEで間違った読み出しを止められる。Z80とDRAMを接続する場合、唯一の問題は、書き込み信号の出るタイミングが遅すぎて、Wだけでリード/ライトを区別すると、ライトの前半でリードの動作をしてしまうこと。4416はOEを使ってそれを止め、データバスの混乱を避けられる。

4416_pin_asign

Z80と4416が相性抜群でもTTLで動かすとなるとコンピュータの全体で12個のICが必要になる。全体の回路図は大き過ぎて表示し切れないから、必要ならこちらのPDFをご覧いただきたい。要点は、状況に応じてRASMUXCASを生成する制御回路。大原則はMREQが来たときだけ動くこと。その上で、RAMのアクセス要求(RAM)が来たらRASMUXCASを適当な間隔で出力する。また、リフレッシュ要求(RFSH)が来たらRASだけを出力する。

sbcz80_logoc

試作機の制御回路はRASMUXCASの間隔を広めにとってある。まずは確実に動かし、成功してから切り詰めていく方針。結果、Z80の標準クロック(2.4576MHz)で安定的に動作し、安価なロジックアナライザがきれいな波形を表示した。あまりにきれいなので、そのまま倍速(4.9152MHz)で動かしてみたところ、通常の動作は成功、割り込み処理で誤動作が頻発。想像では、ROMの読み出しが挟まればいいが、RAMのみのリード/ライトが連続すると失敗する感じ。調整で解決するか、これが限界か、見極めなければならない。

sbcz80_logiana

試作機はプリント基板に組み立てた。プリント基板を起こす段階ではまだテストをしていないから大きな間違いが2か所ある。第1にMUXの極性が逆、第2にZ80とSIOの間に無駄なロジックが介在。これらを修正し、ロジックアナライザへ行く電線を引き出したら、ひどい格好になった。この状態で制御回路の調整をやっても再現性に疑問が残るため、リビジョン2の基板を発注。送料込み5枚7.9ドルのやつで、到着は最悪1か月後になるらしい。

sbcz80_proto_final

ソフトウェアは、正式には27128(2764~27512)に書き込む設計。試行錯誤の段階では書き換えしやすいW27C512を使い、アドレスC000Hから書き込んだ。当初、プリント基板の大間違い2か所に悩まされたが、それを修正したあとは物事がトントン拍子に運ぶ。hello, worldとエコーバックテストと受信を割り込みでやるエコーバックテストに成功。そしてついにGrant’s BASICが起動し、約16Kバイトがフリーだと表示した。

sbcz80_basic

4416と出会ってから2年、ICを12個も使い、たびたび失敗ながら、ようやく実現した16Kバイト。嬉しさのあまりツイッターで自慢したら凄いっていう返信とたくさんのいいねをいただいた。このたった16Kバイトの価値をちゃんと評価してくれるみんなも凄いよ。

広告
カテゴリー: DRAM, Z80 | コメントをどうぞ

V30を思い出した

SBC8088に関するやり取りの中でV30に話が及び、以前、日本電気の98noteを持っていてV30に熱中したことを思い出した。V30はインテル8086にいろいろな機能を追加したCPUで、とりわけ8080のエミュレーションモードを特徴とした。確かエミュレーションモードでCP/Mを動かしたんだよなぁって古いハードディスクを探したら、書きためたいろいろなソフトウェアと98noteの残骸が見付かった。

98note

98noteのMS-DOSでCP/Mを動かすことは比較的簡単だった。V30はエミュレーションモードに切り替えると8080のバイナリを実行するし、エミュレーションモードのままネイティブモードを呼び出すこともできる。だからCP/MのBIOSやBDOSはパラメータをMS-DOSへ引き渡すだけで実現する。参考までに、そういうやりかたをしたEMV.EXEとMASMのソースをOneDriveに置いておく。著作権はパブリックドメインに変更する。

日本電気PC-98シリーズV30搭載機専用CP/Mの実行ファイルとソース-EMV.ZIP

SBC8088はやはりエミュレーションモードを持つV20が動くらしい。OSがないからCP/Mはたいへんだろうが、hello, worldの一部を借りてGrant’s BASICが走ると思う。ぜひやってみたいが、うちの場合、まだSBC8088が完成していない。どんどん広がる夢に現実が追い付かない。

カテゴリー: 8080, 世間話 | コメントをどうぞ

SBC8088のhello, worldを断念

SBC8088 CPUボード修正版とSBC8080サブボード改造版によるhello, worldは皆さんから頂いた対策を含め、現状、思い付く限りのことをやってみたが成功しない。止むを得ず、前回の投稿のあと試みたことをまとめた上で、開発を断念する。このブログでは、いったん断念した開発に再挑戦して成功した事例がたくさんあるので、今回の件もいつか復活して成功する可能性がある。

うまくいかない原因のいちばん有望な見立ては8251に対するout/in命令の間隔が狭すぎるというもの。実際、数個のNOPを入れて解決した人がいる。うちの場合、NOPを10個入れてもダメなので、下に示すサブルーチンを書き足し、out/in命令を実行するたびに呼び出したが、やはりうまくいかない。out/in命令の間隔が狭すぎることは事実だとして、原因がそれだけではなさそうだ。

                        ;
                        ;       Delay
 8041 B91000            delay:  mov     CX,16
 8044 E2FE         8044 dlst1:  loop    dlst1
 8046 C3                        ret

ほかにやってみたことは次のとおり。

・すべてのハンダ付けをやり直した(上からハンダを盛り直した)
・8088とメモリと8251のアドレスバスとデータバスの導通テストをやった
・8088を予備と交換してみた(いずれもAMDのP8088)
・74LS257を予備と交換したり74HC257と交換したりした
・OKI M82C51A-2、NEC D8251AC、NEC D8251Cで試した
・out/in命令のIOアドレス指定を即値とdxで試した
・おまじないを省略してみた
・水晶を14.7456MHz、8MHz、4.9152MHzに交換した

これらの試みで次のような反応が見られた。

・拡張コネクタのIOWは、out xx,alだとH、out dx,alだと振れる
・out dx,alで、NEC D8251ACの場合のみゴミが表示される
・ゴミは電源オンまたはリセットの直後に80個くらい表示されて停止

sbc8088_proto_bug

以上の断片的な事実がひとつのストーリーでつながったとき問題が解決するのだと思う。三題小噺みたいなもんだろうが、即興にもお笑いにも才能がなくて困っている。

カテゴリー: 世間話 | 4件のコメント

SBC8088ハローワールド担当の中間報告

オレンジピコさんで動作未確認SBC8088プロジェクト専用基板3枚組が販売されている。発端はボクが描いたCPUまわりのみの雑な回路図で、以降、tomi9さんが現実的な設計を加えてCPUボードサブボードSBC-BUSを完成させた。この過程でソフトウェアをどうするという話になったとき「hello, worldくらいなら書きます」と発言した関係で、誰からも任命されていないが、ボクがハローワールド担当を自称している。

SBC8088プロジェクト専用基板のうちサブボードとSBC-BUSはtomi9さんが検証されているのでご覧いただきたい。ボクの目標はCPUボードと外部の8251でhello, worldを動かすことにある。実はもうtomi9さんがCPUボードと外部のFT232HLで成功させているのだが、ボクのほうはいまだにモタついている。成果が上がらないからといって何も言わないと何の参考にもならないと思うので、中間報告として、動かない現状を述べておく。

あらかじめ断っておくとtomi9さんは当初から動作保証なしを明言されている。ボクもひとつ勘違いをしてtomi9さんの設計に悪影響を及ぼした経緯がある。実際、SBC8088プロジェクト専用基板は、普通に組み立てれば動くというものにはなっていない。この点は、わざわざ断らなくても了解が成立していると思うが、断っておくことで、このあと基板の修正方法などを述べる際、免責に関する説明を省略させていただく。

sbc8088cpu_top

CPUボードはアドレスラッチ(U3の74LS573)から拡張コネクタへ向かうA0~A7が逆順になっている。このパターンはハンダ面に並んでいるので、ルーターでバッサリ削り取り(緑色矢印)、電線で正しい順序に配線し直した。tomi9さんはこのように修正したCPUボードと外部のFT232HLでhello, worldを成功させているから、ほかに修正の必要なところはないと思う。なお、CPUボードの水晶は指定が14.7456MHzだが、ボクのCPUボードは8251がついてこられない事態を避けるため一時的に8MHzへ落としてある。

sbc8088cpu_bottom

SBC8088 CPUボードは同サブボードと組み合わせるのがスジだろうが、部品の持ち合わせがなくて完成しないのと、技術的な成り立ちを十分に理解していないため、勝手知ったるSBC8080サブボードを改造してつないだ。改造の趣旨は、ROMを上位アドレス(8000h~FFFFh)、RAMを下位ドレス(0000h~7FFFFh)に配置すること、すなわち改造前の配置と上下を逆にする。まず、部品面のパターン2か所をカット(黄色矢印)。

sbc8080subimp_top

ハンダ面はパターン1か所をカット(黄色矢印)。こうしておいてROMとRAMのチップセレクトを入れ替える。部品面のパターンをカットしたとき止むを得ずA15も切り離してしまっているから、A15を改めて配線。ROMのICソケットにはWinbondのW27C512を取り付けた。プログラムはW27C512の8000h以降がそのままのアドレスで使われる。

sbc8080subimp_bottom

この構成で動くはずのhello, worldをGistにアップしたが、実際はウンともスンともいわないので、怪しいところをことごとく削除し、現在は下に示す短いプログラムでテストしている。もはやhello, worldではなく、ただHを出力し続けるだけなのに、やはりうまくいかない。ちなみに、8251を制御する手順はSBC8080/SBC8085でうまく動作したプログラムと一致させてある。

                        ;       SBC8088 terminal test program
                        ;       SBC8080 SUB Board 8251 polling version
                        ;
   0000                 RAM     equ     0000h   ;0000h..7fffh
   8000                 ROM     equ     8000h   ;8000h..0ffffh
   4000                 STACK   equ     4000h   ;stack top
   0000                 REGAD   equ     00h     ;8251 data register
   0001                 REGAC   equ     01h     ;8251 control register
                        ;
                                org     ROM
                        ;
                        ;       start
 8000 8CC8              start:  mov     ax,cs           ;set com model
 8002 8ED8                      mov     ds,ax
 8004 8EC0                      mov     es,ax
 8006 8ED0                      mov     ss,ax
 8008 BC0040                    mov     sp,STACK        ;set stack
                        ;
                        ;       setup
 800B B000                      mov     al,00h          ;escape
 800D E601                      out     REGAC,al
 800F E601                      out     REGAC,al
 8011 E601                      out     REGAC,al
 8013 B040                      mov     al,01000000b    ;reset
 8015 E601                      out     REGAC,al
 8017 B04E                      mov     al,01001110b    ;mode
 8019 E601                      out     REGAC,al
 801B B037                      mov     al,00110111b    ;command
 801D E601                      out     REGAC,al
                        ;
                        ;       H
 801F E401              puth:   in      al,REGAC        ;get status
 8021 2401                      and     al,01h          ;check TxBUF enpty
 8023 74FA         801F         jz      puth            ;wait for empty
 8025 B048                      mov     al,'H'
 8027 E600                      out     REGAD,al
 8029 E9F3FF       801F         jmp     puth
                        ;
                        ;       reset
                                org     0fff0h
 FFF0 EA                        db      0eah    ;jmp
 FFF1 0080                      dw      start   ;offset
 FFF3 0000                      dw      0000h   ;segment
                        ;
                                end

END OF ASSEMBLY.  NUMBER OF ERRORS:   0.  USE FACTOR:  0%

というわけで、現在、製作の工程をハンダ不良から見直しているし、プログラムは古い書籍や雑誌の記事で勉強し直している。「そこは常識的にいって正しいに決まってる」みたいな話を言い出したら間違いがないことになってしまうので、ありとあらゆる事実を疑ってかかることにした。凄腕の人からしたら、ときどきそこじゃないよってところで悩んでいるように見えるだろうが、それしかやりようを知らないから、しばらくは温かく見守ってほしい。いやもちろん、間違いをズバッと指摘してくれたらなお嬉しい。

カテゴリー: 世間話 | 14件のコメント

SBCZ8が完成

ザイログZ8でBASICが動くシングルボードコンピュータSBCZ8が完成しました。これまで2度の試作に失敗し、今回も最初の回路図にいろいろと問題があったのですが、たくさんの人がこのブログやツイッターで助言を寄せてくださり、どうにか修正することができました。深く感謝します。SBCZ8のプリント基板はオレンジピコで頒布します。

SBCZ8_g_top

SBCZ8はZ8681(元祖Z8)とZ86C9116(高速・CMOS・レジスタ増量版Z8)で正常に動作することを確認しました。シリアル端子とパラレル端子を備え、BASICで制御することができます。回路図、部品表など技術的な内容はSBCZ8技術資料をご覧ください。BASICと応用プログラム例はSBCZ8データパックにまとめてあります。

SBCZ8技術資料(pdf)
SBCZ8データパック(zip)
・Z8のデータシート(pdf)-Z8 Famry Design Handbook
・BASICの文法(pdf)-BASIC/DEBUG Reference Manual

BASICはシリアル端末に接続したパソコンの端末ソフトで操作します。主要なレジスタとRAMの全域を操作できるのでZ8の機能をすべて引き出すことができます。下のプログラムはパラレル端子のPORT2を動かしていわゆるLチカをやるものです。

100 REM BLINK LED
110 @246=0 :REM SET P2 AS OUTPUT
120 @2=0   :REM OUT L
130 GOSUB 200
140 @2=255 :REM OUT H
150 GOSUB 200
160 GOTO 120
200 REM DELAY SUBROUTIN
210 I=0
220 I=I+1
230 IF I<20 GOTO 220
240 RETURN

実行結果を下に示します。標準Z8の場合、PORT2に接続したLEDが約1秒ごとに点滅します。なお、PORT2は自由に使うことができますが、PORT0はアドレスバス兼用、PORT3はシリアル端子兼用ですから、慎重に操作してください。

sbcz8_blink

ザイログのCPUはZ80が有名すぎてZ8がいくぶん過小評価されているように感じます。Z8は、Z80とよく似た命令体系を持ち、捉えようによってはARMより凄い124本の汎用レジスタを備えた近代的な設計です。これを機会にZ8の魅力に触れていただければ嬉しいことです。

カテゴリー: Z8 | コメントをどうぞ

SBC6303BLの新スケッチ(暫定版)

SBC6303BL(ブートローダ)の新しいスケッチが出来た。手もとのSBC6303とSBC6303BLで正しく動作しているが、あらゆる状況で正しく動作するかどうかはわからない。みなさんにもテストしてもらったほうがいいと考え、暫定版として公開することにした。新スケッチとテスト用ファイルの一式をOneDriveに置いておく。スケッチを書き換えるだけで以下のとおり動くので、SBC6303BLをお持ちの方、よろしければご協力お願いします。

SBC6303BL新スケッチのテスト用ファイル一式-sbc6303bl2.zip

ハードウェアの設定は従来どおり。SBC6303はEPROMを抜いておく。SBC6303BLはモードスイッチをBL側にする。現状、モードスイッチをRAM側にする使いかたには対応しない。増設RAMモードはないという前提で、SDカードが見付からないとき挿し忘れを警告することにした。そのほうが便利だと思うが、もし不便であればすぐに修正できる。

sbc6303_bl2mode

実行ファイルのファイル名は、いわゆる8.3形式で、拡張子がHEXまたはSとする。従来版スケッチのようにファイル名をINITPROGに書き換える必要はないが、書き換えても構わないから、上位互換性がある。実行ファイルは最大16個まで保存しておけるし、実行ファイルでないものが一緒にいくつ保存されていても構わない。なお、これらのファイルはSDカードのルートに保存する必要がある。フォルダの中身は調べない。

sbc6303bl2_drive

SBC6303とSBC6303BLを接続し、SDカードを挿して電源を入れると、まずSDカードに保存された実行ファイルをすべて表示する。以降、SBC6303のリセットスイッチを押すたびに表示の順番で実行。一巡するとまた先頭から実行する。もしSDカードを挿し忘れたりSDカードに実行ファイルがひとつもなかったりしたときには警告を表示する。

sbc6303bl2_screen

新しいスケッチは、現時点では小さな数個の実行ファイルでテストしたに過ぎない。みなさんがもっているいろいろな実行ファイルがすべてうまく動くことを確認したい。また、操作性に関するご要望、気の利いたメッセージの案なども、できる限り取り入れたい。ちなみに、現在のメッセージでavobeとなっているのはaboveが正解。さっそくやらかしてますなぁ。

カテゴリー: 6800, 書き込み装置 | コメントをどうぞ

AVR CP/Mに苦戦中

つねづねCP/Mが動くコンピュータを作りたいと思っていた。その願望はくまちゃんがプリント基板をくれたZ80-MBC2で叶えられたし、間もなくとみちゃんのSBC8080_CP/Mでも実現するらしい。これらの名作がまだ発表されていない段階で取り組んだのがAVR CP/Mシールド。組み立てを終えたが動作させられなくて、いまだにもたついている。完成までまだしばらくかかりそうなので途中経過を報告しておく。

avrcpm_shield

原案はこちらで公開されているCP/M on a AVR。乱暴な手書きの回路図はさておき、本来は5Vで動かすべきAVRを、SDカードと共通の3.3Vで動かすなど驚きの設計。さすがにそれはまずいでしょうと思うかたわら極限まで部品を減らした執念に感服する。そのシンプルさを保ったまま仕様を順守して動かすため、Arduinoのシールドの形をとった。回路図を下に示す(画像をクリックすると別窓に拡大表示します)。

avrcpm_sch

シールドとはいっても今のところスケッチを書いてアップロードすればいいという形にはなっていない。さしあたってはAVRに直接ファームウェアを書いてArduino UnoのAVRと差し替えることにした。手短にいえばArduino Unoから電源とUSB-シリアルを借りているだけ。とにかく一度ちゃんと動かすまでは取り扱いの便利さに配慮する余裕がない。

ファームウェアはこちら(歴代の各バージョンはこちら)。HEXが配布されているが、それは部品点数が増えた新しいバージョンのやつで、極限まで部品を減らした初代のハードウェアには対応しない。そうでなくても、Arduino Unoで動かすには原案のクロック20MHzを16MHzに下げるなどするためソースを再アセンブルする必要がある。

再アセンブルのための開発環境は公式な説明が見当たらないのでボクが調べた結果を述べる。ファームウェアはWindowsで動くアセンブラavrasm2.exeの書式で書かれている。(こちらで探す)。にもかかわらず、MakefileはLinuxのツールチェインを使う。どうやらLinuxのもとでWindowsのエミュレータwineを使ってアセンブルするらしい。

再アセンブルにあたってはconfig.incを編集して、最低限、クロックを下げ、DRAMアクセスを4ビット単位に定義し直す。あとはmakeとやってみて足りないと言われたツールを追加する。あるいはそのツールを必要としない古いバージョンで試す。最悪の場合、そのツールを使わないようにMakefileを書き換える。ボクは足りないと言われたSVNをインストールできなくて、これを使わないようにMakefileを書き換えた。

avrcpm_asm

こうしていちおうエラーなくHEXを作るところまでは辿り着いた。警告が6件あるが、レジスタ名の再定義というものだからたぶん無視していい。ただし、そのHEXを書き込んでもうまく動作しない。何しろ起動メッセージが表示されないのだから話にならない。せめて修正の手がかりになるような事象が見えないと、この先へ進めない。

カテゴリー: Arduino | 3件のコメント