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を装備したものの、有効活用できないでいます。^^)