SBC68系 128kB バンクメモリボード(3)

SBC68系 128kBバンクメモリーボードのハードウェアができた(はず)なので、メモリーチェックプログラムとかLILBUGへバンク切り替えコマンドを追加してみたいと思います。

メモリーチェックプログラム

SBC6303データパックに拡張32kBメモリーボード用のチェックプログラムがありますので、そちらを参考にバンク切り替えしながらメモリーチェックを実施するプログラムを作ってみます。
以下がgistへUPしたソースです。

  • 今回のRAMボードで$A000-$BFFFに8kBのメモリーも配備したので、プログラムは$B000へ配置しました。
  • バンク切り替えにはHD6303のI/OポートP10〜P12を使用します。3bitの出力に1〜7までのバンク番号(0の場合はバンク1を選択)を出力することで切り替えできます。

実行結果はこんな感じです。うまくチェックできたみたいです。

LILBUGコマンド拡張してバンク切り替えコマンド

バンク切り替えのためにプログラムをいちいちロードしたりして切り替えるのが面倒なのでLILBUGコマンドを作ってみたいと思います。
LILBUGのマニュアルを読んでみると外部コマンドテーブルを作る事ができそう。ユーザーコマンドに該当がなければROM内のLILBUG標準コマンドが実行されるみたいです。

バンク切り替えはBコマンドとかにしたかったのですが、ブレークポイントで使われているため “K”コマンドということにしてみました。

使い方ですが、まずは LILBUGで $B000からGコマンドで実行してください。ユーザー用コマンドテーブルのポインタを更新してバンクメモリーをバンク1へ初期化してLILBUGへ移行します。

! G B000

コマンドの書式は ” K△n “(△:スペース)はバンク切り替えします。nはバンク番号で入力と共に切り替わります。(確認とかナシ)
バンク番号を入れず ” K△[CR] ” だと現在のバンク番号を表示します。

ソースはこちらもgistへ上げました。こちらです。
こちらのプログラムも$B000のRAMに配置しました。ROM化は LILBUG ROMに手が入るなぁと思ってちょっと考え中です。

LILBUGは MIKBUGと違っていろいろと拡張性が考えられているので使いやすいですね!

広告

SBC68系 128kB バンクメモリボード(2)

ユニバーサル基板に試作

回路が固まりましたので、実際にユニバーサル基板にしてみます。
データバスを配線し始めた頃の写真です。

基板裏の配線はいつもどおり、ちょっと太めのスズメッキ線で配線します。
このとき最近SBC80系バスばかり配線していて+5V/GNDが反対側の端子だということに気づかなかったのは内緒です。

配線が終わって記念写真です。
IC間の配線はAWG28、30のワイヤラッピング線を使用しました。ICソケットも今回は全部板バネ式です。(32ピンソケットもSOP型からDIP型へ変換した128kB RAMを使いたかったので細ピンヘッダが入る板バネ式にしました。)

稼働確認

SBC6303と40ピンフラットケーブルでつなぎます。
LILBUGは基本内蔵RAMがあれば起動するので、ちょっと安心です。いつもだとここで応答が無い!!と悩むので….

LILBUGが起動したので、さらに電大版TinyBASICを起動して HD6303内蔵I/Oの初期化&バンク切り替えを実験です。
電大版TinyBASICはメモリー直接アクセスのPEEK/POKE書式を装備していて便利です。

#(0)=$FF
#(2)=xx  (xx:バンク番号 1〜7)

内蔵I/O PORT1の初期化は以下のように、SBC6303データパックのBLINK.ASMを参考に実施しました。

  • 0番地にPORT1のデータの方向をセット。今回は全ビット出力としました。
  • 2番地へPORT1へ出力するデータを設定します。ここは数字で1〜7でバンク番号を指定します。

LILBUGのMコマンドで バンクメモリアドレス($4000〜$7FFF)のデータを変更してはバンク切り替えを実施して、別々のメモリー領域が出現することを確認しました。メモリーボード完成です!!

次は、メモリーチェックプログラムとか、LILBUGのユーザーコマンドとしてバンク切り替えコマンドを作ってみたいと思います。

SBC68系 128kB バンクメモリボード(1)

Z80/8080 CPU用に128kB メモリーボードを作成して動いたので、次はSBC68系の128kB メモリーボードを作ってみたいと思います。

メモリーマップの検討

SBC68系はZ80/8080系と違ってメモリーマップドI/O、つまりメモリーアドレス上にI/O機器がつながっています。
伝統的に$0000〜$7FFFまではRAM。$8000台はI/O、$A000はスタック用RAM、$E000〜とか後ろの方はブートベクタの関係もあってROMにするのが通例です。
当初はPIAやACIA、自分で搭載したFM音源チップなどをすべて$C000台持っていってメモリー領域を確保するという案も検討しましたが、それだとSBC6800/SBC6809の基板にパターンカット等を実施する必要がありちょっとポリシーに反する感じ。以下の方針としました。

  • 固定RAM領域は $0000〜$3FFFの16kBとする。(もともと8kBなのでこれでも余ると思いました)
  • バンクメモリは $4000〜$7FFFの16kBで、7バンク準備。(ここまで128kB SRAMを使用)
  • $A000からのメモリー領域をオリジナルのMIKBUGや電大版BASICがスタックとして使っている(MC6810想定)のため、余ってきている8kB SRAMを配備することにする。

メモリーマップのイメージはこんな感じです。

バンク切り替えコントロール回路

固定RAM領域($0000〜$3FFF)と バンク切り替え領域はどちらも同容量(16kB)としましたので、128kB SRAMを8分割して使用することになります。よって前回と違ってメモリーの3本のアドレスバス信号線(A14、A15、A16)をうまいことコントロールすることにします。
またバンクレジスタ機能は今回はSBC6303のI/Oポートによってコントロールすることにします。(独自のラッチは作りません)

  • CPUが固定RAM領域($0000〜$3FFF)にアクセスする場合はバンクレジスタの値に関わらず A14=A15=A16=”L”とする。
  • CPUがバンクメモリ領域($4000〜$7FFF)にアクセスする場合は、バンクレジスタの示すアドレスを使用する。
    • ただしバンクレジスタに0(ゼロ)が設定されている場合は デフォルトのバンク1(A16=A15=”L”、A14=”H”)とする。

上記を満たすロジック回路を、今回もLogisimを使って2入力ゲートICでシミュレートしてみました。

ゲートIC x3で実現できそうです。

回路図の検討

バンクメモリなどのコントロール回路が決まったので、128k SRAM、8kSRAMをコントロールする回路図を書いてみました。

  • 128kB SRAMの CS1へはアドレスバスのA15を入れます。$0000〜7FFFまでのアドレスならA15=”L”なので…(CS2はVccへ)
  • 8kB SRAMの CS1にはA13、A14、A15を74HC138でデコードした線をつなぎます。(こちらもCS2はVccへ)
  • バンク切り替えコントロール回路へは SBC6303のI/O出力 P10、P11、P12ピンを接続。アドレスバス A14、A15をORゲートを通して 両方”L”のときに”L”を出力させてつなぎます。(74HC138のデコードの代替です)
  • バンク切り替え状況が目で見てわかるように SBC6303のI/O出力 P10、P11、P12ピンにNOTゲート経由でLEDを接続します。

実は….

実は上記の回路図は修正して正しく動いている(と思う)版です。
基板作成当初の回路図では何を勘違いしたか固定RAM領域のデコード部分が間違ってました…orz
修正した箇所はこちら..
(もともとは固定RAM領域の判断に74HC138のO0端子を使ってました…それだと$0000-1FFFしかデコードできてない….)

固定RAM領域の $2000-3FFFFへ書き込むと 間違って バンクRAMの $6000-7FFFへ書き込まれるという事になってしまっていました….
余っていた74HC32のORゲートを使うことで事なきを得ました。良かった〜♬

SBC6303ルーズキットでYM2151 FM音源

ArduinoとZ80自作マイコンで動いたFM音源 YM2151をSBC6303でも動かしてみたいと思います。

拡張基板の作成

Arduinoのシールドとして作ったYM2151 FM音源ボード を載せる子基板を作成しました。
…実は以前作った拡張RAMボードに載せようとおもって40pinヘッダをずらそうと奮闘して壊してしまったのでイチから作り直しました。

拡張RAM以外の部分のFM音源シールドを接続する回路図はこんな感じです。

  • 68系はメモリーマップドI/Oなので拡張RAMのRDWRはSBC6303の拡張コネクタに出力していただいていますのでZ80より回路は更に簡単です。74HC138によるアドレスのデコードだけです。
    • アドレスもなんとなく$C000あたりにしてみました。

各基板はこんな感じです。

演奏ソフト BASIC 〜 MC6800 ASM

電大版TinyBASICで試しに演奏ソフトを書いてみました。音楽データは$3000からLILBUGのLコマンドで配置しておきます。
WAITがインチキですけど音が出たので一安心。

1 REM -------------------
2 REM YM2151 PLAY FOR SBC6303
3 REM -------------------
4 REM 
10 W=$3000:X=$4393
20 FOR I=W TO X
30 GOSUB 100
40 NEXT I
50 END
100 REM - HANTEI - 
110 IF #(I)=$54 GOTO 200
120 IF #(I)=$61 GOTO 300
130 IF #(I)=$62 GOTO 310
140 IF #(I)=$63 GOTO 320
150 IF #(I)=$64 GOTO 320
160 IF #(I)=$66 GOTO 50
170 GOSUB 330:RET
200 REM - PLAY - 
210 I=I+1:#($C000)=#(I) 
220 I=I+1:#($C001)=#(I)
230 RET
299 REM - WAIT -
300 FOR J=1 TO 1 : NEXT J:RET
310 FOR J=1 TO 2 : NEXT J:RET
320 FOR J=1 TO 3 : NEXT J:RET
330 FOR J=1 TO 4 : NEXT J:RET

やはりZ80マイコンのときといっしょで、アセンブラで書かないとちゃんとした演奏はできなさそう。
MC6800のアセンブラ表とにらめっこしながらArduinoやZ80のアセンブラソースとほぼ同じコードを書いてみました。
Z80のつもりで書くと16bitレジスタペアが少ないとか、分岐命令が+/-127バイト程度だったりとかヒッカカリポイントは多数…

通称prontfデバグと、LILBUGのT(トレース)コマンドで無事稼働しました。
ソースをまたgistにUPしました。長いですが以下のようなソースになります。

アセンブリはクロスアセンブラASを使ってMac上で実施しました。
(ソースファイル名はPLAY.ASM)

$ asl -cpu 6800 -L PLAY.ASM
$ p2hex -r \$-\$ -F Moto PLAY.p

音楽データは FCB命令でバイナリデータを並べたものを別途準備。
MacのCoolTERMを使用して1文字あたり1msのウェイトを入れてLILBUGのLコマンドへ転送しました。

MC6800のコードで書いたのはSBC6800でも将来動いたら良いなぁという気持ちもあったりしたのです。
無事 FM音源で 音楽を奏でることができました!!

SBC6303で電大版TinyBASICを動かす

SBC6303ルーズキットを作成したときに、電大版TinyBASICのワークアドレスを一部修正して動かしてみましたが挙動が怪しく….
その解決策がわかったのでまとめます。

※電大版TinyBASICは2kB以上の領域を使用するので増設RAMが必須です。

SBC6303とSBC6800のメモリーの使い方

SBC6303では、技術資料にもあるとおりSBC6800で使えたメモリーの一部がCPUやLILBUGでリザーブされています。
以下がそのイメージです。

  • 電大版TinyBASICでは $1A〜$FFまでをワーク領域として使用しています。
    • $0100以降はインタプリタプログラムなのでROMへ焼いてもOK
  • SBC6303では、$00〜$1Fまでがレジスタ領域、$D0〜$FFがLILBUGの変数域です。
    • $CFからLILBUGのスタック域としても使われてますので、上図よりもうちょっと使えないエリアがあるはず…

電大版TinyBASICのワークメモリーの移動

電大版TinyBASICの変数領域を RAM アドレス $20以降へ移動する必要があります。ただ、単純に6バイト移動させるだけでは正しく動きませんでした。
BASICのソースを読むと 、電大版TinyBASICでは変数は英大文字A〜Zで指定しますがソースではA〜Zのキャラクタコードを1ビット左シフト(x2倍)して変数値の格納アドレスとしていました。

つまり….

  • アドレス $82からからの52バイトは、変数は英大文字A〜Zの変数領域なのでアドレスを動かせません。
  • 変数領域の大半はダイレクトアドレシングモード命令で使用しているため $0100以降へ再配置するとオペコードが2バイト→3バイトへと増えてしまいます。
    • BASIC内部では 分岐命令で *+2 などの記述を多用していたり、分岐命令が256バイトの範囲しか飛べないというMC6800の制約がありオペコードの増加は困ります。
    • ただ、最後の64バイト(〜$0100)はFOR文のスタック域となっていて、元々$0100から逆に使われるということからエクステンドアドレッシングで使われていたためメモリー上どこに配置してもOKでした!

ということで、変数は英大文字A〜Zの変数領域($80のあたり)は固定にして、その他の変数域を調整することでBASICを動作させることが可能です。

SBC6303で 電大版TinyBASICが動きました!!

以前bit誌 を見ながら打ち込んだ 電大版TinyBASICのアセンブラソース について上記の変更を実施してアセンブリしました。(BASICインタプリタ本体もメモリー上で稼働させるときは $200あたりにずらしましたが…)
無事、電大版TinyBASICが 動くようになりました!!

1から10まで足し算してただしく計算できています。(変数域を動かしたときは計算間違いしてました ^^) )

ちなみに、SBC6303+PIA(パラレルI/O)のLEDチカチカプログラムもBASICで書くとこんな感じです。
電大版TinyBASICはPEEK/POKE構文があるのでメモリー入出力やI/Oデバイスの入出力が書けるのです。メモリーマップトI/Oの強みですね。

SBC6303にPIA(MC68B21P)を接続

オレンジピコで68系のパラレルI/O LSIのPIA(MC68B21P)が売られていたので思わずゲットしてしまいました。
Z80でPPI(8255A)でLチカできたので、SBC6303でもLチカしてみたい。

SBC6303は外部バスに8ポートのI/Oポートが出てますが….そこは「やってみたい」ということで…
今後以前作った MC6800べースの SBC6800のパラレルI/Oボードを作成する布石という意味もありまして…

まずはブレッドボードに実験環境を…

SBC6303ボードを作成した際、拡張RAMボードをユニバーサル基板に組みました。
PIA(MC68B21P)も拡張RAMボードに搭載すれば良いのですが、ちょっと自信がなかったのでまずはブレッドボードで実験環境を作ってみます。

せっかくユニバーサル基板で拡張RAMボードを作ったのに、またブレッドボード上にSRAM 62256(32kB)を載せて動かしてみました。なんかリード線がニョロニョロ出てますけど動きました。
ちなみに外付け32kB RAMへの配線は SBC6303データパック SBC6303技術資料 とまったく一緒です。

PIA(MC68B21P)をブレッドボードへ搭載

SRAMを搭載したブレッドボードへ、PIA(MC68B21P)を搭載します。回路図はこんな感じです。
LEDをBポート側に8個装着してLチカしてみたいと思います。

  • CS2はSBC6303基板本体の74HC138からジャンパ線で持ってくれば簡単でしたが、基板に手を加えたくないので別ICで外付けしました。
  • PIA(MC68B21P)の各種制御ピンの信号もSBC6303の外部バスにすべて出ていますので直結すればOKです。
  • LEDの電流制限抵抗は適当に….

すべて接続した状態はこんな感じです。ちょっとジャングル状態。

Lチカ用 アセンブラプログラム

Lチカ用にアセンブラでLILBUGで動くプログラムを作りました。
作ったといっても、初期設定はPIA(6821)の使い方参考書の丸写しで、LチカのウェイトのあたりはSBC6303データパックのBLINK.ASMを参考にさせていただきました。(貰い物だらけですが…)

  • ソースはgistに上げてあります。
  • PIAの初期化でAポートのデータ方向レジスタは入力に設定してますが、今回は何もつないでません。(DIP SWとかつけると楽しそう)
  • LEDはBポート側へ8個つないでますのでデータ方向レジスタは出力に設定しています。
  • 一つおきに点灯/消灯させるため出力データは$AAとビット反転した$55を出力しています。

ソースコメントにも書いてますが、アークピットのクロスアセンブラでアセンブリできます。
書式はたしかこんな感じで、モトローラS形式のオブジェクトがテキストで生成されます。

> X6801.EXE LEDON.ASM,LEDON.S,LEDON.LST;

LILBUGへ流し込んでLチカ!

アセンブルできたら、SBC6303のLILBUGを起動してLコマンドでモトローラS形式のオブジェクトを流し込んだ後、Gコマンドで$0100から動かすとLチカしました。

成功です!!
ちなみにZ80+8255Aのときといっしょで、PIA(MC68B21P)のポートが”L”レベルのLEDが点灯します。

SBC6303ルーズキットを作る

ここのところの電子工作熱を再燃させていただいた 書籍 モトローラ6800伝説 のスピンオフ企画である SBC6800ルーズキットSBC6809ルーズキットにつづいて、SBC6303ルーズキットが発売されました。
☆下の画像はスイッチサイエンスさんに直リンク…


モトローラ6800伝説

いままで作ったMC6800系のCPU(バイナリ互換&拡張あり)ですが、RAMを128バイト内蔵していたり、シリアルやパラレルI/Fまで内蔵するワンチップマイコンって感じの石です。

SBC6303 ボード作成準備

さっそく部品を集めて作ってみました。部品はVintagechips氏作成の技術資料にもあるとおり各部品店に通販で申し込みをしました。あとは技術資料を見ながら作成開始です。
今回は以前のボードのようにPICでクロック作成等は無いため部品さえ揃えば(ROMライタがなければスイッチサイエンスでLILBUG ROMが販売されていますので…)はんだ付けを確実に実施すれば動くはず。

https://vintagechips.wordpress.com/
電脳伝説

部品集めで苦労?したもの

CPUは技術資料にもありますが若松通商で売ってました。
Twitterでも最近流れてますが 「40ピンL型ボックスヘッダ 」が意外と扱っているところがなくて、千石電商に通販を頼みました。あまり売れ筋じゃないのかなぁ。
秋月電子に40ピンフラットケーブル(短いの)はあるんですけどね。

ボード作成&テスト

今回のボード本体にはSRAM ICは載ってません。ROMからLILBUGをブートするとCPU内蔵の128バイトのRAMを使って動作します。
作成にあたってはさほど注意するところはありません。水晶発振子をクロックとして動作するのでPICの焼き込み等も不要です。水晶発振子の周波数がシリアル端末の速度に関係すると思うので半端な周波数ですが…
機械語モニタ LILBUGのROMについては、私は手元にUSB ROMライタのTL866CSがありましたので EEPROM AT28C256 (オレンジピコでかいました)にデータパックのHEXファイルを焼き込んでおきました。若干EPROMとはピン配置は違いますが今回は8kB分しか使わないので、SBC6800同様問題ないはず。

はんだ付けして Vcc/GNDのあたりの電圧が正しく来ていることを確認後、各ICを挿入。
技術資料にも出てるHELLO.Sを実施しました。LILBUGのLコマンドでモトローラS形式ファイルを流し込んでGコマンドで実行。動作OKです。

つづいてLEDチカチカさせる BLINK.SをLILBUGのLコマンドで流し込んで実行してみます。
注意点はLEDの向きを間違えないことです。ブレッドボードとメス-オスのケーブルと抵抗器があればOK。

32kバイト拡張メモリ

さて、128バイトではRAMが心もとないので、CY62256NLL-70PXC (32kB SRAM)をユニバーサルボードに組んで40pinフラットケーブルでつないでみたいと思います。
技術資料の作例通りで配線はZ80ユニバーサルマイコンを作ったときと一緒でポリウレタン被覆線を使用しました。いちいち被覆を剥かなくて良いので楽ちんです。
データシートでは他の同型SRAM(HM62256とか)とアドレスバスのピン配置が違いますが、気にせず技術資料の作例通りで配線しまして…..

RAMチェックのMEMCHK.SをLILBUGのLコマンドで流し込んで実行….$7FFFと応答があったので32kB分正しく認識されていることが確認できました。

次は??…

機械語モニタLILBUGへアセンブラでプログラムを書いて投入すれば何でも?できる環境にはなりましたが、ぜひバイナリ互換なので電大版TinyBASICを動かしてみたいと思いました…..が、ちょっと難航しています。
MIKBUGとLILBUGの文字入出力ルーチンあたりの調整だけでイケルかと甘いことを考えていましたが…..$0000〜$001FまでLILBUGのレジスタ領域として取られていたり、$00FFから若干のメモリがLILBUGのスタックとか変数領域で取られていて電大版TinyBASICのワーク領域とぶつかるのです。(32kB RAMにしたのに先頭から256バイトの範囲で取り合いが…)

$0100以降にメモリ領域へ電大版TinyBASICのワーク領域を移動させると、今度はBASICのオブジェクトコードがあちこちで長くなって2バイト命令が3バイト命令になり相対ジャンプが届かなくなったり….
ちょっと工夫が必要の模様で頓挫中です。(←根性なし…)

シングルボードマイコンシリーズの中では最大容量のSRAMを装備したものの、有効活用できないでいます。^^)