SSブログ

Z80ボードにオリジナルモニタ [Z80]

8085用に作ったモニタをZ80に移植。
まずは8080 -> Z80のニーモニックコンバータを捜す。
いくつかあるが意外とない。
一つ試してみたがまともに変換しない。
古いソフトは1行80桁までしか認識しないとか、日本語コメントを使っているがするがそれが悪さするとかためにあるけどその辺かな?
と思いつついちいち検証していくのも時間がかかるので、エディタで検索置換を駆使して力技で変換していく。
あとはシリアルが8251なのをZ80SIOのものに置き換え。
8085ボードは8085のRST7.5,6.5,5.5割込を使っているので、ブート時に設定しているのをZ80のモード2設定に変更。
ぐらいだろうか?
Z80に変更だからといって、Z80固有の命令を使って書き直すなどということまではしない。

PICのファームは基本同じだが、10msインターバルタイマ出力は8085ボードはRST7.5に入れている関係でH出力にしていたのをL出力に変更。もっともZ80ボードでは使用していないが。

Z80基板も新しく作り直した。

syc8-z80-rev_b_p.jpg

コネクタからの配線を、1.27mmピッチ1列のパターンにいったん並べ直して…、というのをやめている。これはメモリボードも同様に修正している。
あとは4隅のホールパターンを変更ぐらいかな?

このボード、Z80SIOの2chのうち片方を10Pヘッダにだしていて一応PCのCOMポート配列にあわせているが、RS232レベル変換しているわけではないのでPC用COMポートケーブル使って直接COMポート接続ができるわけではない。
スペースに余裕があるのでMAX232でも載せれば良かったかな?

nice!(2)  コメント(0) 
共通テーマ:趣味・カルチャー

8085CPUボード [8085]

ずいぶんと間があいてしまったが今回は8085。
基板自体は初期のうちに作っていたのだが、8251のフットプリント選択ミスで作り直して後回しだったのをようやくお披露目。
それ以外にも色々変更を加えていたので、何から何まで基板を起こし直した。

まず8085ボードがこれ

syc8-8085-rev_b.jpg

いつものようにPICでUSB-シリアル変換とクロックとリセット。
部品実装したのがこれ

syc8-8085-rev_b_p.jpg

パターン引き回しの都合でICの向きが揃ってない(笑)
PICでCPUクロックとボーレートを生成している。CPUクロックとして6MHzをだしているので8085は3MHz動作。
あと、PICで10ms間隔でワンショット出すようにしていて、8085のRST7.5に入れている。

マザーボードというか4連のバスボード
こちらは部品実装済みの写真

syc8-base-rev_c_p.jpg

USBコネクタは給電専用。プルアップ抵抗はリセットや割込系はCPU、あるいはシステムによって要求されるものが違うので個別に抵抗を設定。アドレスとデータのバスのみ集合抵抗。データバスが4素子2個になっているのはパターンの都合。

コネクタの間隔を修正して20mmスペーサが使えるようにした。
そしてメモリボード。こちらも部品実装済みの写真

syc8-64k-rev_b_p.jpg

バスの規格はGUPPYバスに合わせていると言ったが、*MREQ信号を68系ではEとしていたのを68系でも*MREQに変更。それにともなって68系のCPUボードも作り直している。それらもまたいずれ。
その変更に伴って最初のものと比べてMREQとEの切替スイッチがなくなっている。

ベースボードにCPUボードとメモリボードを挿すとこうなる。

syc8-8085-mem64.jpg

ベースボード側のUSBコネクタから給電。CPUボード側のUSBコネクタでPCと接続。
最初のやつは基板の厚みを考慮せずにコネクタピッチをきっちり20mmしていたのを1.6mm拡大。
おかげさまで20mmスペーサが使えるようになった。基板の厚みは1.6mm限定だが。
ソフト製作中でもあって頻繁にROMの抜き差しをするのでメモリボードを前面に出しているが、こうするとリセットスイッチが押しにくい(笑)。パーツの配置は色々考慮してしっかり考えないとダメですね。


今回、モニタを自分で作ってみた。今まで使ってきたものもオープンソースなんだろうけど、自分で作ってしまうとその辺全く気にしなくてよくなるので。
必要最小限の簡単なモニタのつもりがそれなりのサイズになってしまった(笑)。昔と違ってメモリリソースを全く気にする必要がないので、省メモリ化を全く意識せずに作った。
モニタ実行の様子

mon_run.jpg

まだ細かいところで「?」となるのがだいたいできてるのでこれでよしとしておく(笑)

特に著作権を主張するつもりもなくオープンソースのつもりなので、回路図、基板のガーバデータ、モニタのソース等、そのうち公開するつもり。需要があるかどうかは知らないが。
nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

HD63701でTiny BASIC [6801]

かなり間が空いてしまったが引き続きHD6301関係で、これまたTiny BASIC。
製作したボードはHD6301の動作モードを変更できるようにしているので、外部ROMレスでの動作を試みる。
MC6801系の内部ROMサイズは4Kバイトなので、4Kのサイズに電大版Tiny BASICとモニタを詰め込むことにするが、電大版Tiny BASICは2Kを少しオーバー。使用しているモニタLILBUGは元々は2K内に収まっているようであるが、シリアル入出力に割込を使用したり、タイマやポート等のちょっとしたルーチンを入れたので2Kを超えてしまっている。
そこでモニタの一部機能を削除することにした。
多くの人がMC6801系を使った自分システムにLILBUGを流用しているようだが、決してMC6801系の汎用モニタというわけではなく、モトローラの評価ボード(?)のモニタであるのでそのハード依存部分が多々ある。

(1)トレースはPTM(MC6840)を使用したもので使えないので、トレースコマンドを削除。
(2)NMIもトレースで使用しており、自作ボードはNMIを使用していないので削除。
(3)その他、使用しないであろうコマンド(VERIFY等)を削除。
(4)基本ルーチンは、AccBにファンクション番号をセットするシステムコール形式になっており、当時の小規模な8bitマイコンシステムにしてはしっかりしたつくりになっているが、システムコールの数も少ないし、テレタイプ前提の紙テープパンチャー/リーダ関係を削ると、実質シリアルin/outしか残らないので削除し、単なるサブルーチンコールに変更。
(5)その他、今まで変更してきた箇所は変更したまま使用。

(5-1)改行コードはLF。これはモニタ側も。
(5-2)TinyBASICの演算処理等、可能な限りDレジスタを使用した16bit演算処理に変更。
(5-3)テレタイプライタ前提の制御処理は削除。

以上3つの変更処理は今までで変更済み。

以上色々削った結果、TinyBASICとあわせてぴったりと4Kに収まった。
今回使用するCPUは次の2つ。

hd68p01_hd63701.jpg

HD68P01V07とHD63701V0C。
窓付のHD63701は珍しいかな?なぜかそれなりの数量を所有しているが。

まずはHD68P01V07。
32KbitROM、2732にソフトを焼いてHD68P01の上にセット。
ボードはモード6となるようにジャンパセット。

syc-6801-hd68p01v_1.jpg

何の問題なく起動しTinyBASICも動作。
次にHD63701。
今、これを焼けるROMライタはないと思われるのでアダプタ基板を製作。
ユニバール基板に手配線でと考えたが、今この程度の手配戦もおっくうになってきてしまっているので結局基板を起こした。

hd63701_writer_adpter.jpg

写真左側が生基板で、右が28pin側に連結ソケット、40pin側にZIFソケットをハンダ付けした完成形。
HD63701は内蔵ROMサイズは4Kバイトだが、27256タイプのROMとして認識されるのでROMライタには27256、あるいは27C256として設定。
使用しているアセンブラはモトローラSレコードしかはかないのでバイナリ変換し、ROMライタにはファイルスタートアドレスを$F000~として読み込ませる。

hd63701_writer_adpter_2.jpg

写真のようにROMライタにセットし書き込ませ、ソフトを書き込んだHD63701をHD68P01に変わってセット。
これも無事動作成功。

syc-6801-hd63701v_1.jpg

入出力関係を削りすぎたせいか、モニタの一部動作がおかしいのはご愛敬(笑)





nice!(0)  コメント(5) 
共通テーマ:趣味・カルチャー

HD6303で電大版TINY BASIC(3) [6801]

8ビットマイコン基板の時のHD6303基板は色々ミスがあってパターンカット&ジャンパー飛ばしでデバッグしていたのだが、結局新規に起こしなおした。たぶん最初の基板も動くとは思う。最終確認していないけど。
これはHD6301/6303の64pinシュリンクパッケージのXあるいはY用で、今手元にはこれだけ。
種類はもちろん、数的にももう少しあったと思う。

HD6301XY.jpg

左上からHD6303XP,HD63A03XP,HD63B01X0P,HD63X03X0P
右上からHD63701X0P,HD63B701X0P,HD6301Y0P,HD63C03YP
HD63B01X0Pはマスク品でたぶんなんらかのファームウェアが入っているはず。

その中からHD63C03Yを使って電大版Tiny BASICを動かしたいと思う。

SYC-6303Y_1.jpg

I/Oコネクタはまだ付けていない。
このボード、MREQではなくEをそのまま出しているのでメモリボード側でジャンパ切り替えて対応。

SYC-6303Y_2.jpg

ソースの変更点は
(1)ピン数増えているので内蔵I/Oも増えていて、その分ゼロページのI/Oレジスタ占有量も増えているので、またメモリのマッピングを多少変更する必要がある。
(2)増えた分のI/Oレジスタは継ぎ足しで既存の分の機能はほぼ変わらないので、SCI等のソース変更はなし。
(3)I/O追加に伴う割込増加分と、未定義命令トラップが追加されている分ベクタが増えているが使わなければこれも同じでOK。アドレス下位方向に追加なので、念のため新規割込もダミールーチンへJMP。
(4)XとYではI/Oも多少違うのだが、Yの方が上位互換とみなせるのでYの固有機能を使わなければ同じで構わない。もちろん、Xからの固有機能も使っていない。

USB-シリアル変換、クロック生成を行っているPICも変更。
(5)MC6801および40pinまでのHD6301はSCIを外部クロックで使用する場合、ボーレートの8倍入力だったが、HD6301X(Y)はなぜか16倍に変更されているので16倍クロック出力に変更。
(6)HD63C01を使うので3MHz動作のためにシステムクロックも12MHzに。
実際には12.6MHz程だからCPUクロックは3.15MHzで多少オーバークロック。

それら小変更で難なく動作。

前回と同じベンチマークプログラムを動かしてみた。

bench_result_20181113_1.jpg

タイムは824カウントだから約8.2秒。
前回は約0.8MHz動作で32.9秒だったので、ほぼクロック通り4倍動作となっている。
ちなみに6801向けに演算にDレジスタ使ったバージョンです。

モトローラ6800伝説

モトローラ6800伝説

  • 作者: 鈴木哲哉
  • 出版社/メーカー: ラトルズ
  • 発売日: 2017/12/16
  • メディア: 単行本(ソフトカバー)



モトローラ 6800伝説

モトローラ 6800伝説

  • 出版社/メーカー: ラトルズ
  • 発売日: 2018/02/23
  • メディア: Kindle版



nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

HD6303で電大版TINY BASIC(2) [6801]

HD6303で電大版Tiny BASICの続きです。
MC6801系にちょっとオプティマイズしてみます。

MC6800は8080に比べてきれいなアーキテクチャだと言われ、確かにそうだとは思うが、当時のモトローラは8bitマイコンなんてこの程度で充分と思ったのか、それとも当時の半導体技術ではこれが精一杯なのか、機能が絞り込まれていて使いにくい。
具体的には8bitCPUだからというわけだろうが、8bit単位でしか演算できない。これはまだ個人的には許容できるが、インデックスレジスタをスタックに操作できないというのは結構使いにくいところに感じる。
MC6801になってその辺が解消され、ACCAとACCBを連結して16bitのACCDとして扱えたり、インデックスレジスタXをスタックへPUSH/PULできるようになり、扱いやすさがぐんとあがり、その後6809につながっていく事になる。

そういうわけで電大版Tiny BASICをMC6801向けにカスタマイズしていく。
(1)16bit演算に変更
BASICの扱う数値データは16bitの整数なので、MC6800ではACCAとACCBを下位、上位としてそれぞれ演算しているのはACCDで可能な限りまとめて行うようにする。
(2)16bitデータ転送の変更
これも(1)と基本的に同じで、アキュムレータに対するロード/ストアも可能ならDレジスタとして一括で転送
(3)インデックスレジスタのスタック退避
これも一応変更を考えたが、単純に退避するだけの目的の場合退避先がゼロページの場合はPULで同ステータス数、PUSHで+1となってしまい、パフォーマンス的な効果が薄いのでそのままにする。

参考までに加算命令のダイレクトアドレッシングとインデックスアドレッシングのクロック数を記しておく。

DIRECTINDEX
ADDA(B)
3
4
ADDD
4
5

これだけみれば1クロックの差しかないが、16bit計算だと8bit計算を2回することになるので、ある程度のパフォーマンスアップを期待できるのでは?と思う。

さて、(1)(2)の変更で特に(1)に関して問題となることがあり、TinyBasicはACCAを下位バイト、ACCBを上位バイトとしているが、MC6801のDレジスタはACCAが上位バイト、ACCBが下位バイトと逆であること。下位バイトだけ、上位バイトだけというケースや、80系がそうであるようにアキュムレータというばAということで、とりあえずAで処理しそれをそのまま下位バイトにという処理もあり、とにかくDにしてしまえ!というわけにいかず、ソースのいたるところでACCAとACCBを入れ替えて行く必要がある。
さらに、一見Dレジスタは16bitのアキュムレータとしてACCA(B)と同様に扱えそうで、ローテート命令がないなど一部制約があり、そういう場合は処理はそのままだが上位下位の扱いが逆になっているので、それだけは入れ替えとなる。
ちなみに加算処理の場合だと、

ADDJSRPOP
INX
INX
ADD3ADDA1,X
ADCB0,X
STAXSTAA1,X
STAB0,X
E7RTS

これが

ADDJSRPOP
INX
INX
ADD3ADDD0,X
STAXSTD0,X
E7RTS

こうなる。
加減算は単純に置き換えるだけですむが、乗除算はそうはいかない。
以上を踏まえて変更していき、なんとかそれっぽく動作したので簡単なベンチマークをとってみた。

CPUHD6303
動作クロック0.8MHz


同じ基板、同じCPU、クロック発生用のPICも同じでROMだけ入れ替え。
前回書いたとおり、このシステムは内蔵タイマを使って10ms間隔で割込を掛け、TinyBASICの変数Tをカウントアップさせている。
ベンチマークソフトは最初にT=0で初期化しておき、主要処理終了後にTの値を表示させる単純なもの。
ベンチマーク用のBASICプログラムソースはこれです。

bench_src_20181111_1.jpg

単純な四則演算を繰り返すだけ。
10msが3301カウントなので、約33秒です。
MC6800版と移植したものの結果がこれです。

bench_result_20181111_1.jpg

MC6801向けにDレジスタを使用したバージョンの結果がこれです。

bench_result_20181111_2.jpg

3292カウントだから約32.9秒。
何回か繰り返し実行してだいたい同じで、その差約0.1秒。
若干速くなっているが、インタープリタはソースを読んで解析していくのがやはりメインなのか、処理中の演算処理の割合が低いのだろうな?という事でしょう。

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

HD6303で電大版TINY BASIC [6801]

引き続き68系。
最初に作った基板HD6301/6303ボード。
ワンチップモードでのみ動作確認までだったが、実はその後外部ROM/RAM実装でLILBUGモニタの動作確認までOK。
すっかり間が空いてどこまで書いたかも忘れている。
CPUはHD6303Rに。オーバークロックでも動作するのだが、供給クロックを3MHzに。つまり動作クロックは0.75MHz。
実際は3.2MHzほどでているので0.8MHz動作。
こんな感じです。

SYC-6801_HD6303R.jpg

このボードに前回MC6802ボードに搭載した電大版TINY BASICを入れる。
オリジナルソースをベースとせず、MC6802ボード用に変更したソースをベースにした。
元々MC6800系のBASICだから、MC6802ボードでは割込使用送受信関係ではまったとはいえ、それ以外は比較的簡単に移植できたがMC6801系は色々と変更部分がでてくる。
8bitの6800系はゼロページエリアが重要で、電大版Tiny BASICもワークエリアはゼロページが前提になっているが、

・ワンチップマイコンであるMC6801系はそのゼロページにペリフェラルI/Oのレジスタ群が存在する。
・せっかく搭載したLILBUGなのでそれベースにTINY BASICを動かすつもりだが、LILBUGはMIKBUGと比較して機能が豊富な分ワークエリアも多くとる。
・実は送受信関係のバッファ操作のためのワークもゼロページにとってしまっている。
・I/OレジスタとLILBUGのワークの除いて、BASIC用の変数A~Zのアドレス($82~52バイト)を固定して確保する必要がある。

I/Oレジスタ($0~固定)とLILBUG、独自ワークエリアとTINY BASICのワーク全てあわせて256バイトに収めること自体は可能だが、TINY BASICは特定のワーク変数からの相対位置をみていたりヘタに動かせない部分がある。
そういった制約の中で色々配置を換えて移植してみた。

ベースは前回のMC6802のものでゼロページ以外のメモリ配置はほぼ同じ。モニタがMIKBUGからLILBUGになったぐらい。
実はFORループ処理用のスタックが$0100になっており、つまりFORスタックはゼロページなのだが、これはMC6802ボードへの移植時にゼロページ外に出している。

今回はソースリストでのラベルBUFFER部分をゼロページ外に出すことにした。
これはキーボードから入力された文字を一時的にためていくところ。領域も比較的大きいので外に出す意味は大きい。
ただし、この部分が一番ワークの相対位置関係が決まってヘタに動かせない部分でもある。
このワーク部分のオリジナルソースを抜粋

ORG$1A
BUFEND RMB 2
BUFFERRMB 80
EXSTK EQU *
EXSP RMB 2
RMB52


ORGからBUFENDまでは色々ワーク変数があり、さらにBUFENDからBUFFERまでは別のワーク変数が4バイト存在するが省略。
ワークエリアが$1Aから始まっているのはA~Zの変数領域が$82からになるようにするため。

BUFENDにはBUFFERに入力された最後尾のアドレスが入る。
EXSPは計算等に使うスタック。変数のアドレスをEXSPが示す領域にプッシュ/ポップして計算処理をする。
実際はスタックに入れてプッシュ/ポップではなくインデクスレジスタに入れて、だが。
EXSPの初期値には自身のアドレスであるEXSTKが入る。
位置関係が固定されている最初のポイントがここで、スタックオーバーの判定にBUFENDと比較される。ようするにEXSPがバッファラスト(BUFEND)まできたらスタックオーバー。
その部分

LDXEXSP
DEX
DEX
CPX BUFEND
BEQ ERR180

これが下限チェックで上限チェックはこちら

LDXEXSP
CPX#EXSTK
BEQERR180


ちにみに最大入力判定をBUFFER+70としているので、計算スタックの最小は10バイトと想定している模様。
この部分を確保したスタック領域の先頭、末尾か?で行うように変更。

EXSPの次の52バイトが変数A~Zの領域で$0082~の固定領域となっている。
入力行解析時、それが変数なら1bit左シフトし(Aなら$41→$82)変数アドレスを設定しているが、実は上位アドレスとしてBUFENDの中の値を設定している。
その部分の抜粋

TSTVBSRSKB8
CMPA#$40
BEQARRAY
CMPA#'A
BCSNOTV
CMPA#'Z
BHINOTV
ASLA
LDABBUFEND
INX
RTS


アキュムレータAには文字コードが入っていて1bit左シフト下値が変数の下位アドレス。
アキュムレータBにBUFEND、つまりバッファ使用領域最後尾、n文字入力していたらアドレスBUFFER+nの上位を入れている。
これより変数領域はBUFFERと同じ上位アドレスで下位が$82からの52バイト、かつBUFFERの領域が256バイト境界をまたがないなら構わないことになる。
実際、「マイコンてづくり塾」のΛ-1の電大版TINY BASICは、BUFFERからまとめて$E400に配置している。
ただ本のソースリストは

F400 BUFFER RMB 80
EXSTK EQU*
F450 EXSP RMB2
F452 RMB 52

となっていて、
これはリストのタイプミスなのか、それとも本当にそうしてしまっているのか、変数領域は$F482からになっていないし、にもかかわらず変数のアドレス算出はアルファベットの文字コードをASLAとオリジナルのまま。もっとも、$F4xxの領域はそれら以外に使ってないので、プログラムの想定通りではないが問題なく動くだろうとは思う。

話が少しそれたが、変数領域はゼロページのままにしておくので、BUFENDの値を入れずに固定値0を設定するように変更(CLRB)。

大きな変更は以上。
一部ワークエリアをゼロページ外に移したので、相対ジャンプが範囲外になってしまう所等を修正。
結局、一番動かしにくいワーク領域を移動させてしまったが、以上の修正で動作OK。

修正ではないがMC6801のタイマも動かしていて、約10ms周期で割込を掛けているがついでに変数Tをカウントアップするようにしてみた。
何かのベンチマークテスト用。

あと、これはMC6802版からだがBASICだけでなくモニタも含めて、改行をLFに統一。
オリジナルは入力の改行判定はCR。改行出力はCR+LFを送信している。

MC6802ボード用に修正した時点からそうだが、シリアルの送受信キューはともに256バイトと余裕たっぷりにとっているし、スタック領域変更ついでに多めにとったし、限られたリソースでBASICを動かすというTINY BASICの趣旨には反しているけども、今だからできる贅沢かな?
nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

MC6802CPUボード [6802]

またちょっと間が空いて、今回は元に戻って68系の話。
MC6802のCPUボードを起こしました。

SYC-6802_1.jpg

MC6802とACIA(MC6850)のボード。
例によってPICでシリアル-USB変換、CPUクロック、ボーレート供給、リセットを任せているが、これはZ80のものと全く同じもの。
CPU用のクロックは6MHz。MC6802は4分周されるので1.5MHz動作。シリアルボーレートは9600bpsで、クロック供給はACIA側で16分周するものとして9600×16=153.6K。
一応今までのものと同じように電源はCPUボードからも通信用USBと電源用のUSBと選択できるようにしたが、ベースのボードからスマフォ充電用のACアダプタで電源供給。
ベースボードにCPUボードとメモリボードをさして動かしている状態がこちら。

SYC-6802_2.jpg

メモリボードはZ80で使用したものと同じもの。ただしZ80と違って下位アドレスがRAM、上位アドレスがROM。
メモリボードのバス7番ピンは80系のMREQと68系のEを切り替えるようにしてたのだが、メモリマップドI/Oの68系では結局の所I/Oアドレスの時にメモリアクセスを禁止しなければいけないので、CPUボード側でMREQとIORQを生成するようにした。
回路図はこちら。

SYC-6802_3.jpg

動作確認用として68系定番モニタMIKBUGと電大版TinyBASICを用意。
この電大版TinyBASICを動作させるのに手間取ったのが間が空いた理由。

そのままでは動かないので修正を施す。

・MIKBUG修正点

(1)いわゆるコンソール入出力をACIAに変更。
MIKBUGはパラレルI/OであるPIA(MC6820/21)を使ってシリアル通信を行っているのを、ACIAでのシリアル通信変更。
ついでに送受信とも割込で行う事にする。

(2)コンソールは当時のテレタイプライターが前提になっているのでその部分を修正。
テレタイプライタの制御部分、最後に$FFを連続して送ったり、文字列終端がEOTだったりといった部分を削除。

(3)アドレス配置を変更
これは普通にこちらのメモリマップにあわせるだけ。

MKIBUGの動作はわりとすんなりOK。
リセット後にブートメッセージを表示させるようにしてみたら、最初の4~5文字が化けるのはご愛敬(笑)

・TinyBASIC修正点

次に電大版TinyBASIC。ネットにあったソースをベースにさせてもらった。
一応、昔「マイコン手づくり塾」という本に掲載されたソースを打ち込んだものもあるが、あれはメモリ配置も含めけっこう手が入っているのでオリジナルに近いものからの方がいいかな?という判断。

(!)MIKBUG前提部分の修正
MIKBUGも同時に移植しているのでそのままでいいはずだけれども、ACIAでしかも送受信割込を使った独自の入出力に変更したこともあり変更。

(2)テレタイプライタ制御部分の修正
これもMIKBUGを使う事が前提になっていることもあって、テレタイプライタ用の制御コードが色々入っている。LOADとSAVE代わりでもあるLISTはSTXで始まり、ETXで終了であるとか。
LIST出力時は別段問題ないと思われるが(TeraTermの場合)、LOADでSTX待たれても困るので。
ただしLOADの動作確認はしていないので、ちゃんと動くかは未確認。

(3)アドレス配置の変更
これもこちらのメモリマップにあわせて変更。
ただし、変数A~Zのメモリ配置はゼロページの特定領域決め打ちになっていたりするので、影響少ない範囲で最小限に。
ちなみに「マイコン手づくり塾」のTinyBASICは、その変数領域もゼロページ外に変更してたりする。

そうやって変更を加えたのだが、起動はするがうまく動作しない。
で、変更部分のチェックからはじめて、ベースにさせてもらったソースと自分で打ち込んだソース、打ち込み元の本のソースリストを見比べて修正していったがやはりダメ。
ただ、動作現象的にTinyBASICのワークアリアを侵食してしまっているか、スタックが崩れているかかな?と思いながらソースを順に追っていたところ、スタックポインタをインデックスレジスタ代わりに使っているのを所々発見。
あぁなるほど、送受信に割込を使っているからスタックにワークエリアを設定している時に割込がかかるとアウトになる模様。
スタックポインタ操作前に割込禁止。一連の処理終了後に割込許可を入れたら無事動作しました。



nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

オリジナルベースボード [8bitマイコン]

ワンボードで動く基板は最初のHD6301のものだけで、あとは2枚以上の組み合わせで動く基板になってしまったわけだが、その連結にGUPPYのマザーボードを利用していたがそれも基板をおこしてみた。


SYC8-Bus_1.jpg

最大4枚の基板を搭載できるのと、ついでに電源の供給と電源スイッチ。一応プルアップ抵抗を入れたが、アドレス線、データ線、制御信号線(MREQ,IORQ,RD,WR)はそれぞれの単位でジャンパで選択できるようにしてみた。
クロックや割り込み関係、リセット等はプルアップは個別にした。これらは抵抗値を選択する必要になる場合があるため。ただ、今回は全て何も考えず10Kに統一。
この手の物は専用のラックがあってガイドレールが付いていてまっすぐ抜き差しできるのだが、裸の状態ではピンを曲げずに抜くのに気をつかう。
コネクタの間隔をなんとなく20mmにしてしまったが、基板の厚みをすっかり失念してしまったので既存のスペーサ等で連結固定することはできない。ちょっとぐらぐらするが固定運用することはないと思うので、まあいいか…。
追加することがあれば基板の厚み分(1.6mm)間隔をあけるのだが、追加することはないだろうな…

接続例はこれ

SYC8-Bus_2.jpg

GUPPYのベースボードの時と同じZ80CPUボードとメモリボードを使用。
ベースボード側からスマフォ用の充電器で給電。CPUボードにもシリアル通信用USBからと、それとは別にUSB給電をジャンパで選択できるようにしてあるが、ジャンパ外してどちらもカット。

ついでにスタック接続用の基板も同じZ80とメモリで作ってみた。

SYC8-stack.jpg

今時の流行というか、こっちが主流ですね。40Pの連結ソケットなるものも、RaspberryPiのおかげか手に入りやすいし。
連結ソケットは間隔がだいたい10mmになるのだが、ICにソケットを利用するとIC上面と上部基板の端子が接触するので少し浮かしている(笑)
ROMの入れ替えを頻繁に行うだろうな?と思ってCPUボードをベースにしてメモリをスタックさせたが、リセットスイッチを押せない(笑)
最初からこういう事を想定していたら、リセットスイッチを基板端に寄せていただろうに。
こちらはシリアル通信用USBコネクタから給電。
ちょっと動作が不安定。プルアップが一切入っていないからかな?

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

Z80でGUPPYボード [Z80]

製作しているボードはGUPPYシリーズに規格をある程度あわせているのだが
そのGUPPYボードの紹介。

(1)GPY-01

GPY-01.jpg

4MHzのZ80Aと8255AがのったCPUボード。
64Kbitのメモリを2個載せることができてオプション。

(2)GPY-13

GPY-13.jpg

キーボード/ディスプレイIF、8279ボード。
これを使って昔ながらの16進キー、7Seg.LEDのシステムでも作ろうかと思うが
こちらで作っているCPUボードはアドレスデコードを端折ってCSにA7をつっこんでるだけ。
それに対してこのボードは20H~3FHの範囲で選択。
完全に被ってそのままでは使えない。

(3)GPY-07

GPY-07.jpg

64K×4のDRAM2個で64KBメモリボード。
この手の制御基板システムは、1枚でCPU+メモリ+αとスタンドアローンで動かしオプションI/Oを別ボードで、というのが普通だと思うので8bitのアドレス空間を占有してしまうボードも珍しいかな。
一応バンクメモリ方式にもできるので、データ保存用のメモリ拡張がが主目的か?

(4)GPY-45

GPY-45.jpg

AD75004のDAコンバータボード。
オプションでもう一つAD75004を搭載できる。
これは取説がないので詳細は不明。

今回はGUPPYバスにある程度あわせたので、GUPPYも使うことができるという検証で

(5)GPY-06
ROM/RAMボード

GPY-06.jpg

を使ってみる。写真は既にROM/RAM搭載済みだが製品はオプション。
これは64KbitのROM、あるいはSRAMを4個搭載できるメモリボード。
74LS138で64KBのメモリ空間8等分したチップセレクト信号を生成しているが
デフォルトでは
    2000H~
    4000H~
    6000H~
    A000H~
となっているので、パターンカットして
1個目のメモリを0000H~1FFFFHとなるようにジャンパを切り替える。

動作確認用ソフトはTinyBasic。
RAMはA000H~BFFFHにするのでメモリロケーションを変更してアセンブル。
ROMは2764。中華製の安価なROMライタTL866Aで書き込むのだが、このライタ用書き込みソフト、メーカ名、ROMの型番と選択させるのだけど各個の正確な情報は持っていない模様。
どれを選んでも書き込み電圧は12.5Vになっている。2764タイプが12.5VになったのはCMOS品からだったように思うのだが…
書き込み電圧を21Vに設定してROM焼き。問題なく動作。
そのうち、いずれかのI/Oでも動作検証してみたいと思う。

nice!(1)  コメント(0) 
共通テーマ:趣味・カルチャー

Z80基板動作確認(2) [Z80]

Z80の続きです。

Z80SIOを使ったTinyBasicを拝借させてもらった古典電脳伝説の著者さんのブログで「電脳伝説」というのがあって、GranzBasicなるものを動かしていらっしゃるのでまたまた倣ってみました。
GranzBasicは、こんなおもちゃにはもったいないぐらいなものです。
せっかくというわけでもないが、少々手をいれてみた。

(1)アドレス配置を多少変更する
(2)送受信とも割り込みで処理する

(1)はまぁ、個人的な好みの問題にすぎないが、メイン処理、共通ルーチン、ドライバ関連をそれぞれまとめてマッピングを分ける。という事を完全ではないが少しだけ修正。
コードとデータは分離するというのもあるが、これもほんの少しだけ。三角関数のテーブル等細々あって全部やるのは手間暇かかるため。
関連するデータがコードのすぐそばにあると、エディタの1画面内に収まったりしてみやすいとか、相対アドレッシングを使用しているので近くにないとダメとか、そういった理由だろうが個人的にはなるべくわけたい。
あとは、8080系は最初の256バイトがベクタエリアでもあるし、CP/M等特別な領域として使われることが多々あるので、そこにコードを入れるのはなるべく避ける。

(2)は昔の遅い8bitのシングルタスクのシステムで送信を割り込みで行う意味はあまりないかもしれないが、これもまぁ趣味みたいなもの。
同時にリングバッファの処理をなるべく簡略化したいので送受信ともバッファを256バイトにする。
これでメモリをフルに使うようなプログラムを書くことはまずないだろうから、バッファを大きくとっても問題なし。
あとはバッファの配置を256バイト境界にしておけばベース+オフセットの計算をすることなく、ベースの上位バイトをHに、Lにオフセットを入れればすむので簡単。

送信割り込みに関してだが、
送信割り込みを使ったシリアル送信のポイントは通常時は送信割り込み禁止、送信開始時に許可して送信完了で送信割り込み禁止に戻すというのが普通(?)だと思うが、実際Z80SIOのデータシートをみるとトランスミッタバッファエンプティ時に割り込みがかかるとなっていて、つまりエンプティになった時に割り込みがかかるエッジ判定ではない。
これは多くのシリアルIC、あるいはマイコン内蔵シリアルがそうなっているような気がするが、MC6801がエンプティになった時に、とエッジ判定となっている。
割り込みがレベル判定なので

・送信データがなかろうとエンプティフラグがたっているので送信割り込みがかかる
    ↓
・送信データがないので何もせず割り込みを抜ける
    ↓
・エンプティフラグがたったままなのですぐに送信割り込みがかかる

と延々繰り返す事になり通常動作に入らなくなると思われる。
でいつもやっているように、つまり

・送信バッファに送信待ちデータがなくSIOも送信バッファエンプティなら
 SIOに直接データを書き込み送信割り込みを許可する
・送信割り込みがかかったが送信待ちデータがなければ送信割り込みを禁止にする

と組んでみて動作確認もしたのだが
Z80SIOには「保留中の送信割り込みをリセットする」という機能があって、なんのこっちゃ??と思っていたが後でそういうことか!?と気付いて、

・常に送信割り込み許可にしておく
・送信割り込みがかかり送信データがなければ「保留中の送信割り込みリセット」

に変更してみたがこちらで問題なかった。
データシートの説明は時々???となる言葉や表現がよくあり、特に海外のものは日本語訳が???だったりするし、Z80SIOのような高機能なものは文の量も多く解読に時間がかかってしまうことも多々ある。読解力がないだけかもしれないが(笑)

動作検証として、これまたasciiart.basをそのまま使わせてもらいました。

asciiart_screenshot.png

問題なく動作していると思われる。

一応、Z80ボードは修正なくほぼフィクスなので回路図です。

Z80CPU-Board.jpg

PICには3.3Vの電源出力があって何もせず解放ピンにしているが、データシートにはパスコンつけろ的な事書いてあるので再度基板つくる事があれば追加するかな?
USB給電なのでPCとつなげば即立ち上がります。
PC側の接続認証に多少時間がかかるので、ものによってはブートメッセージが表示されない事があります。
ねんのためスマフォのACアダプタ(micro-Bタイプ)が使えるようにしている。ただし自動認証ではなくジャンパ切替。
今時は2.1ΦジャックのACアダプタよりこっちの方が手に入れやすいと思われるので。
ただ、今後はType-Cが主流になるのかな?Type-Cの給電専用コネクタはまだみたことないが。

メモリボードの回路図はこれです。

memory-board.jpg

色々想定を盛り込みすぎていて

・ストローブとして80系はMREQ、68系はEを想定していて論理が逆なので切替
・アドレスの下位ROM上位RAM(主に80系)、下位RAM上位ROM(主に68系)の切替
・ROM側をRAMと切替て全RAM可能なように

それぞれジャンパで切り替えられるようにしている。
それぞれの基板をおこしてもよかったのかもしれないが…
全RAMは先を考えてで、ようするに別の手段でCPUリセット中あるいはHALT中にブートローダをRAMに仕込んで、というやつです。
UV-EPROMは消去に手間暇がかかるので。
ただ、その仕込みはもっと時間がかかるので本当にするかどうかは…
nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。