SBC6800ルーズキットに32kB RAMとPIA(MC68B21P)

以前、SBC6303ルーズキットの拡張コネクタから線を延ばしてブレッドボードでパラレルI/O(PIA-MC68B21P)の稼働を確認しました。

一番最初に作った SBC6800は拡張コネクタが無いのでLチカができませんし、RAM拡張もできません。
しかし、ラッピング用ICソケットで嵩上げしたら2階建てにできるので色々と子基板に装備できるはず!
(@vintagechipsさんのこちらのツィートを見て、「これだ!」と思ったのが始まり..)

子基板の作成と32kB化

まずはMC6800とメモリーの足を延ばして2階建てにしてみようと思いました。
ただ、地元の部品店では40pin のラッピング用ICソケットはありましたが、20pin 300milのラッピング用ICソケットの在庫が無く、代わりに買ってきたのがラッピング用ピンヘッダです。

ただこれだとラッピング用ICソケットと足の高さがいまいち合わないので、SBC6800子基板の間はラッピング用ピンヘッダ、子基板上には普通の40pin 600milと28pin 300milのICソケットを装着して頑張って配線してみました。
本当は28pin 300mil→600milで 14pin分 配線頑張って SRAM 32kB化のつもりが、40pin+28pinで68pinも配線が必要となりました。(T-T)
先に全部のピンヘッダをはんだ付けしたんですが、実は28pin 300milの内側が狭くてはんだ付けがたいへんでした。片側ずつ作るべきでした。

ひとまずSBC6800 32kB化完成した写真がこちらです。
☆ラッピング用ICソケットは太くて 丸ピンICソケットには刺さらないので、SBC6800の6800 CPUとRAMのソケットは板バネICソケットである必要があります。

この段階ではパラレルI/O MC68B21Pを載せようという野望でICソケットだけつけてありました。
SBC6800からの改造ポイントとしては、SRAM(62256)の足3本(A13,A14,A15)を配線することで32kB化を実施しています。
($0000-$7FFFをRAMとするのでA15が”L”か”H”かでコントロールです)

  • A13 → 62256 A13 (26番ピン)
  • A14 → 62256 A14 (1番ピン)
  • A15 → 62267 #CE (20番ピン)

子基板にしたのでSBC6800が無改造で済むのが嬉しい。嫌になったらデフォルト構成に戻れます。

ちなみにMIKBUGのワーク領域も $1Fxx→$7Fxxへ移動したものをEEPROMへ書き込んでいます。
これはソースを修正してリアセンブリして TL866CSで焼くだけなので簡単。ついでに電大版TinyBASICもいっしょにROMに焼いておきました。

ちなみに、メモリーテストも6800アセンブラで書いて実行してみました。
SBC6303のメモリーチェックのソースを拝借してSBC6800用に修正しました。

  • メモリーの端から端までチェックすると、MIKBUGのワークまで壊すので $7F02〜5のあたりに、実行前に設定が必要です。($0100〜$7EFFとか….)
  • いつものMIKBUGの実行アドレスは $7F48〜へ変更してます。

こちらが実行画面です。うまくいきました。

子基板のパラレルI/O(PIA)のあたりの回路図

子基板にパラレルI/O(PIA)も載せたいと思ったので、そのあたりの回路図を書きました。(32kBメモリー(62256)は省略です…)
できればSBC6303と同じような拡張コネクタも装備してみたい。配線がたくさんあってちょっとめげますが…

パラレルI/O(PIA)のあたりの配線 〜 Lチカ

またもLチカネタとなりますが….
子基板の回路図のうちパラレルI/Oのあたりだけ配線してLチカしてみました。
(まだ40ピンボックスヘッダの配線はしてません….のんびりやります….)

LEDチカチカ用のユニバーサル基板も別途作成して、これで思う存分Lチカができますw

ユニバーサル基板にラッピングワイヤ を使用して配線してみました。
単芯なので配線しやすいですが、被覆が熱に弱いので短時間ではんだ付けする必要があります….

余談….

ちなみに色々と作っていて手持ちのハンダが切れたので、地元の部品店で久々に千住金属製の巻ハンダ(スパークルハンダ)を買いました。
はんだ付けしたときの光り具合が最高です。はんだ付けしてて気持ちいいです。

広告

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

LPC810マイコンで作ったコンソールをSBC6800へつなぐ

1チップマイコンでシリアルコンソール

LPC810というマイコン(なんと8pin DIPなのに32bit!!)でシリアルコンソールがつくれるという記事がこちらで公開されています。
この回路をプリント基板へ起こしたものがオレンジピコで販売中だったので、早速買ってみました。(2018/4/22現在売り切れ?)
入力はPS/2キーボード、出力は懐かしのアナログビデオ出力です。

SBC6800をスタンドアロンコンピューターにできそう?!

部品あつめ

部品はメインとなるLPC810マイコンチップと抵抗器、コンデンサなどです。

  • LPC810マイコンチップ
  • 秋月電子などでも販売されていましたが在庫が無いようです。安いときは100円を切っていた模様ですが、今は安くて100円台の模様。(すでにディスコン??)
  • 抵抗器
  • 1/4W程度のカーボン抵抗を使いました。10kΩx2、390Ω、180Ω、51Ω(回路図ではそれぞれ400Ω、170Ω、51Ω)
  • コンデンサ
  • 元回路図ではすべて0.1μFでしたが、オレンジピコの回路図では3端子レギュレータの両端は10μFが指定されていたのでタンタルコンデンサを使用。(極性があるので注意。間違うと発火するらしいです)
  • その他 5v→3.3V 三端子レギュレータ、PS/2キーボード端子、RCA端子(アナログビデオ)、ピンヘッダ等…

ハンダ付けの注意

  • 部品のハンダ付けで注意するところはあまりありませんが、いつもどおり背の低い部品からハンダ付けが吉です。
  • タンタルコンデンサを使用する際は極性に注意。+と-を間違えると発火したという画像がたくさんあります….
  • 三端子レギュレータはトランジスタみたいにちっちゃいやつじゃないとうまく収まらないかも。
  • ジャンパピンを差す2列ピンヘッダの手持ちが無かったので、1列ピンヘッダを並べて装着しました。

LPC810へプログラム書き込み

稼働の前にLPC810へプログラムを書き込む必要があります。
こんな感じで接続しました。LPC810は3.3V駆動ですので5Vは三端子レギュレータ経由でつなぎます。
LPC810開発ボードのジャンパピンは全部はずした状態で実施しました。

参考→LPC810(6) 〜 ISPモードでのプログラム書き込み

  • 以下のページからリンクされているzipファイルをダウンロードして展開します。
  • LPC810を使ったコンソール(紹介編)
  • バイナリ形式とHEX形式のファイルがあり、106キーボードの場合は “con810_106.hex”を使用すれば良い模様。
  • 書き込みには Macで lpc12isp を使用しました。(Homebrewで導入できます) コマンドと実行結果は以下のような感じです。書き込みが上手く行ったらターミナルモードに入るので[esc]キーで抜けます。これで書き込み完了のはず。
$ sudo lpc21isp con810_106.hex -hex -term /dev/tty.usbserial 115200 12000
Password:
lpc21isp version 1.97
File con810_106.hex:
loaded...
Start Address = 0x0000010D
converted to binary format...
image size : 3316
Image size : 3316
Synchronizing (ESC to abort). OK
Read bootcode version: 4
13
Read part ID: LPC810M021FN8, 4 kiB FLASH / 1 kiB SRAM (0x00008100)
Will start programming at Sector 1 if possible, and conclude with Sector 0 to ensure that checksum is written last.
Erasing sector 0 first, to invalidate checksum. OK
Sector 1: ...|.|.|.
Sector 2: ...|.|.|.
Sector 3: ...
Sector 0: ..|.|.|.
Download Finished... taking 1 seconds
Now launching the brand new code
Terminal started (press Escape to abort)

Terminal stopped

$

稼働!…しない?だと?

SBC6800とクロス接続

今回作成したシリアルコンソールとSBC6800ボードを接続してテストしてみました。接続は以下のようなかたちでGND同士を接続とTx(送信)とRx(受信)を互い違いに接続してみました。

SBC6800のスイッチをON!! にしてみましたがカーソルは出るものの無応答…orz
しかも4.2インチ液晶モニターのカーソルはジワジワとスクロールアップしていきます。水平同期が合っていない模様。

SBC6800のスイッチをOFF/ONするとたまに? “*”とか入力したコマンドが表示されます。どうもシリアル通信が詰まっている模様。^^)
試しにMacにシリアル-USB変換基板をつないで同様に3線で接続してターミナルソフトを立ち上げてみたらちゃんと通信できました!! これはSBC6800との接続でなにかありそう….

原因はRTS/CTSの接続でした

クロス接続の基本がなってなかったわけですが…..原因はRTS/CTSの接続でした。

こちらにクロスケーブル接続の例が2つ出ていますが、今回つくったLPC810シリアルコンソール基板はRTS/CTSがありませんので、SBC6800側をショートさせる必要があるのでした。…. orz (←相変わらず基本がなってない..)

気を取り直して、このような接続へ変更。

うごきました!!

スクロールする問題

上の動画でも まだスクロールする問題が治ってませんが、@houmei さんより初期の4.3インチモニターだと発生する事象らしいという情報をいただきました。(Ichigojamではちゃんと映るけど、MSXなどではスクロールする模様)
Ichigojamでも安定しなくて水晶振動子を追加で買った気がしてきました。LPC810へ焼き込んだプログラムの調整で安定しないか試してみたいと思います。

この記事はつづく?…かな??

モトローラ6800CPUボード(SBC6800)にMC68B02Pをのせる

MC68B02Pを入手した

SBC6800基板にターゲットを定めたような品揃えをしているオレンジピコで、MC68B02Pが出ていました。M6800 MPUにクロックオシレータと128バイト(kBじゃないよ)を内蔵したCPUです。

先人の方々がCPU下駄の作成例を公開されていたり、回路図を公開されています。参考にさせていただきました。

レトロな雰囲気〜SBC6800用6802アダプタを作った
ほうめい 計算機再生事業団さん

高校時代に購入したモトローラ6800CPUでマイコン自作する本の続編で、MC6802を使った実例が出ていて、ぜひ作ってみたかったのでした。(続編の本は捨ててしまったかも…)

部材あつめ

こちらで紹介いただいているCPU下駄を作ってみようと部材を集めました。

  • 40pinCPUソケット(下駄用)
    • MC68B02Pは6800CPUといっしょで40pinDIPです。地元の部品屋に丸ピンタイプと板バネタイプがありましたが、改造するなら足が柔らかい板バネタイプが良さそうでした。
  • ユニバーサル基板
    • ユニバーサル基板は、サンハヤトのブレッドボード互換ユニバーサル基板を使ってみました。
    • 片面基板ですが薄くて加工しやすそうだったのと、複数のランドがつながっているため配線が楽そうでした。
  • 表面実装コンデンサ
    • 6802CPUのデータシートなどで27pFx2という記述がありましたが、地元の部品屋では22Pまたは33Pしかありませんでした。。とりあえず22Pの表面実装タイプを購入しました。
    • 小さいものであれば積層セラミックコンデンサでもイケるかも。
  • 4Mhz水晶振動子
    • クロックオシレータのピンへ接続する4MHzのの水晶振動子が必要です。
  • 配線用線材
    • 線材は適当なビニル線で良いかと思っていたのですが、場所も狭いため 使ったことはなかったのですが、ポリウレタン被覆線が良いと聞き地元の部品屋で買ってきました。

CPUソケットへユニバーサル基板を固定

40pinCPUソケットに合うようにユニバーサル基板をカッター等で切り(ラジオペンチで強引に曲げて割り…)、CPUソケットの切り込み部分もなんとなく加工した上で、瞬間接着剤で固定してみました。

つけてみたものの、なかなか小さくて老眼にはキツい工作となりそうでした。

配線作業と注意

配線作業を開始します。接続するピンは
こちらにもあるとおりで、以下の表にまとめてみました。

参考:6802CPU

接続ピン 接続部品
38pin(XTAL)
39pin(EXTAL)
水晶振動子を38〜39pinにつなぎます。そこからコンデンサ(私は22PF…本当は27pF)を介してGNDへつなぎます。
35pin(VCC Standby) $0000から32バイトの電源バックアップ電源端子です。Vcc(8pin:+5V)へつなぎます。
バッテリー等でバックアップしないから繋がなくて良いと思って手を抜いたら、ここをVccに繋がないと、32バイト分のRAMにアクセスできなくてハマりました。(←手を抜くと無駄にハマる例というか…)
36pin(RE) GNDに落として”L”レベルにすることで内蔵メモリー(128バイト)を無効にします。ちょっともったいないですけど、SBC6800のRAMと競合するので….

  • ポリウレタン被覆線(0.4mm)を使いましたが、慣れてなくてなかなかハンダゴテの熱で被覆が融けずハンダが乗らなくて苦労しました。エナメル線みたいに事前に紙やすりで被覆を削っておいたほうが幸せになれそうです。(もしくは、先が平らなコテ先を使うとか..)ソケットも熱で溶けちゃいましたw もうちょっと細い0.3mmなどの線のほうが良かったかも。
  • 表面実装部品の手ハンダが初めてで、ユニバーサル基板の穴にハマったりして苦労しました。なんとかくっついた感じです。(はんだ付け汚い…)

CPUクロック用のPICを書き直し

こちらで紹介いただいている手順で、MPLAB X IDE上でPICのソースを修正、ビルドしてできたインテルHEX形式のオブジェクトをPICKit3で書き込みます。

  • このPICの修正で、PICで生成していた外部クロックを停止するのと、3pin(MR)のレベルを”H”にする模様です。

MC68B02P MPUを装着してスイッチON!

CPU下駄とPICが出来たら、下駄にMC68B02Pを装着してCPUソケットにさしPICも差し替えて電源ON!です。

☆接続の注意で書いた”35pin(VCC Standby)”を手抜きで繋いでいないとMIKBUGとマイクロBASICは無事?動いているように見えましたが、VTL言語や電大版TinyBASICは$0000番地からの32バイトにアクセスできないため変な挙動をしました。

無事 MIKBUGと電大版TinyBASICが動きました!!

MC68B02PでMIKBUGと電大版TinyBASICが無事動いたことから、何度もCPUを抜き差しすると下駄が壊れそうだったので、SBC6800基板をもう一つ購入して2台体制にしちゃいました。

モトローラ6800CPUボード(SBC6800)で電大版TinyBASICを動かす (8) EEPROMにまとめ焼きとSTARTREKゲーム

電大版TinyBASICがソースからビルドできるようになったので、EEPROMへ焼いてスイッチONでMIKBUGやBASICが動くようにしたいと思います。

EEPROM書き込み用オブジェクトデータの準備

古風平凡さんのページの手順に従ってオブジェクトデータを準備したいと思います。

MIKBUGのソースをアセンブリ

  • データパックに入っているMIKBUGのアセンブラソース(MIKBUG.ASM)をアセンブリします。
  • 古風平凡さんのページのプチ拡張部分はBASIC起動コマンド追加だけでも行っておくと便利だと思います。
  • 前回書いたとおりクロスアセンブラASを使用する場合はコメントや文字定数などの修正が必要です。(けっこうメンドイ)

VTL(SA版)のソースをアセンブリ

  • データパックに入っているMIKBUGのアセンブラソース(MIKBUG.ASM)をアセンブリします。
  • 古風平凡さんのページで紹介されている開始番地 ORG疑似命令をいじったりする部分を修正します。
  • クロスアセンブラAS用にコメントや文字定数などの修正も実施。(こっちのほうが修正量多いかも…)

電大版TinyBASICソースをアセンブリ

  • 前回RAMロード版でテストした電大版TibyBASICですが、古風平凡さんのページの手順通り ORG疑似命令を変更して $E200 からから書き込むことにします。
  • RAM版のアセンブリのときに、RAMフリーエリアのスタートアドレスを変更していなかったので、$0100へ変更します。これでフリーエリアが広がるはず。

インテルHEX形式へ変換と1ファイルへ合体

これらのアセンブリでできた オブジェクト(xxx.p)をp2hexコマンドで今度はインテルHEX形式へと変換します。後段で ROMライタ(TL866CS)を使った書き込みを実施しますが、その際にインテルHEX形式である必要がありますので…

コマンド書式は以下になります。

$ p2hex -r \$-\$ -F Intel XXXX.p

3つのインテルHEXファイルができたら、1つのテキストファイルへテキストエディタなどで合体します。
注意点としては合体する各ファイルの最終行にEOF行(:00000001FF)ががありますので、上2ファイルは取り除く必要があります。(取り除かないと途中で書き込みが終わっちゃいます)

【参考】
インテルHEXフォーマット

EEPROM書き込み用機器の準備

書き込み用のインテルHEXファイルができたら、EEPROMへの書き込みを実施します。

ROMライタ TL866CSと書き込みソフト

今回わたしはAmazonで4500円ぐらいで購入したUSB接続の中華ROMライタ(TL866CS)を使用しました。
この値段であればROMライタを自作しても同じくらいかそれ以上の部品代がかかりそうなので、素直に購入しました。

残念なことにEPROM書き込みソフトはWindowsのみ対応です。
EPROM書き込み用のソフトは、年賀状ソフトの稼働のためだけにMac上のVirtualBOXにWindows2000を導入していましたので そちらで稼働させました。ただ、これまた残念ですが配布されている自己解凍exeファイルはWinXP以上でしか動かないため別のXPの環境で解凍したファイルをVirtualBOXのWindows2000環境へ持ち込みました。(手順が回りくどい….w)

書き込み用EEPROMを買ってくる

スイッチサイエンスで販売されているMIKBUG/VTLの書き込み済みEPROMは、消去する際に紫外線ランプが必要なタイプです。
紫外線ランプを持っていない私としてはEEPROM(フラッシュ?)の方が楽ちんです。

オレンジピコ(CAT28C256やATC28C256)、若松通商(HN58C256P)でEEPROMの256kタイプが数百円で手にはいります。

参考URL → オレンジピコ AT28C256

EEPROM書き込みの際の注意点と手順

技術資料に書き込み方の注意があるとおり、ROM容量によって書き込む際のアドレス指定をする必要があります。
256kだと全体容量としては32kBですが実際は上位8kBだけ使うかたちとなります。(ちょっともったいない?)

中華ROMライタ(TL866CS)の設定は以下のところに注意です。

  • “Selected IC”
    • CAT28C256やATC28C256はサポートチップなので、”Selected IC”メニューから選択しておきます
    • HN58C256Pはメニューにありませんが “Selected IC”メニューで uPD28C256 を指定すると問題なく焼けました
  • 「P」ボタンで焼き込みの際…
    • 今回は256kタイプのEEPROMを使ったので、機械語ファイルを$8000を$0000に指定して書き込みました。
    • 書き込んだ結果確認としては、ツールの16進ダンプ表示の $6000あたりからから、インテルHEXデータ(MIKBUG+電大版BASIC+VTL)と同じものが現れるはず。

EEPROMの差し替え、スイッチON!

EEPROMが焼けたら、もともとのMIKBUGのみのEPROMと差し替えてスイッチONです!
MIKBUGの入力促進プロンプト “*” が出ればひとまずOK。つづいてBコマンドで電大版TinyBASICを起動してみます。

PRINT$ コマンドでフリーエリアを確認すると7kBぐらいに広がってるはず!!

ブルーバックスのSTARTTREKゲーム

この環境であれば、ブルーバックスに電大版TinyBASICと一緒に掲載されている “STARTREKゲーム” が動くはず….ということで、ぽちぽちと入力をしてみました。

母艦のMacのテキストエディタで入力してみましたが、転送する際に単純にシリアル端末へコピー&ペーストするとBASICの取り込みが遅くて取りこぼします。ここは残念ですがWindowsのTeraTERMなどで1行ごとにWAITを入れてあげる必要があります。

詳しくは古風平凡さんのページに出ています。

まだ入力間違いが取り切れていませんが、私の環境で電大版TinyBASICのSTARTREKゲームが動き出しました。

これで、モトローラ6800CPUのマイコンを作るという夢につづいて、高校時代からの夢〜自作パソコンでSTARTTREKゲームをやる〜 が叶いました!! うれしい!!

モトローラ6800CPUボード(SBC6800)で電大版TinyBASICを動かす (7) アセンブリリスト入手とクロスアセンブラ

ダンプリスト版の電大版TinyBASICは動いたので、EPROMへ書き込んでフリーエリアを確保したいと思います。
ただ、ソースリストが無いとアドレスを変更するのは至難の業です。

ソースリストの入手と打ち込み

幸い 電大版TinyBASICのソースリストは昔々のbit誌に掲載されていたという情報をキャッチしました。
みなさん詳しいなぁ….

国立国会図書館へbit誌の遠隔複写を依頼

古風平凡さんのページで電大版TinyBASICのアセンブラソースは「bit誌 1978年8月(Vol.10,No.8) P52-P57 に掲載されている」という記述がありました。「ああ、昔の雑誌は手に入らないよなぁ」と半ば諦めていたところ…

日本中の書物があるという国立国会図書館で「遠隔複写」というサービスがあるというのを知りました。
ちなみに、関東圏などに住んでいて国立国会図書館へ出向くことができるなら、館内閲覧とか複写が可能みたいです。

便利すぎる!国立国会図書館の遠隔複写サービス(コピー)を利用した結果

上記のリンク先の手順で国立国会図書館のページで検索してみたところ、なんと該当のbit誌がちゃんとありまして、しかも電子化されていました。ただし、著作権保護の観点からからインターネット閲覧はNG。でも目次が詳細に確認できました。
※目次は電子化されていないと分からない模様です。bit誌はラッキーでした。

国立国会図書館にIDを登録し、bit誌の該当の箇所や旧いASCII誌のVTLを使ったスタートレック(!)の記事など20ページ程度をインターネットで「遠隔複写」として月曜日に依頼。木曜日夕方に複写完了&発送のメールが届きまして その週末土日には記事のコピーが手に入りました!! うれしい!!
地方在住者には非常に嬉しいシステムです。

A3見開きでコピーしてくれたものがはいってまして枚数は10枚となってました。A3封筒のなかに請求書も同梱されてましてコピー代は10枚分。手数料/送料入れても1,000円未満でした。大昔の雑誌の一部が手軽に手に入ったのはビックリでした。
今回は事前に目次/ページNo.がわかったのでラッキーでしたが、複写したいページが不明等の場合調査依頼をお願いすることも可能のようです。

代金はコンビニ/郵便局等々で支払可能で、わたしは郵便局のATMから支払いました。
郵便局設置のATMだと振込用紙が使えるものがあって、窓口が開いていない土日でも振込できて便利です。

アセンブルリストの打ち込み

さて入手したアセンブルリストをソース・ファイルとしてMacで入力します。

ちょっとズルをしてOCR出来ないものかといろいろと試しましたが、やはりダンプリストのときと同じで当時のプリンタ印刷品質の悪さから結局全部手入力しても変わらないと思い、またも手入力修行に励みました。…orz

きっと、もっと精度の良いOCRがあるとこの作業が軽減できるはず。
PC-8001とかFM-7とかのダンプリスト入力に特化したOCRを開発されている方もいらっしゃると聞いてますので、老眼をショボシヲョボさせながら入力しなくて良い時代がもうすぐそこに…

手入力する意義としては、モトローラ6800CPUのニーモニックの使い方がジワジワと分かってくるというところがあるかもしれません。(リストを見ながら入力したからと言ってアセンブラプログラムが即読めるようにはならないですが….)
文字が判読しづらい部分も、アセンブルリストであれば16進機械語コードが併記されていますので、無味乾燥な16進ダンプリストを入力するよりも判定が容易です。

クロスアセンブラの入手とアセンブル実行/モトローラSフォーマットへの変換

入力したアセンブリソースを親機であるMac上でアセンブリして モトローラSフォーマットのファイルを作りたいと思います。
本来ならモトローラ6800CPUが乗ったSBC6800ボードでセルフアセンブリできると良いのですが、メモリーが8kBしか無いということもあり、昔の方々がミニコンで行っていたクロスアセンブリを現代はパソコン(PC/Mac)上で実施であります。

クロスアセンブラの入手

いろいろなページで紹介されているクロスアセンブラは、アークピットのアセンブラ(たぶんWebアーカイブページ)でDOS版です。DOSのプログラムはWinXPやWin2000であればOS互換プロンプトで動く模様。

アークピットのアセンブラ

【4/17修正】
アークピットさんのアセンブラ掲載ページURLをただしいものへ変更しました。失礼しました。

今後を考えて(今後があるのか??) Mac上でアセンブルしてみたいて思います。
わりと最近のWindowsやOS/2(!!)、Linux/Mac等のUNIXマシンで動くクロスアセンブラがありました。

The Macroassembler AS

紹介していただいているページはこちら → 6809マイコン – HD63C09載せかえ

クロスアセンブラのビルド

The Macroassembler ASのクロスアセンブラはWindowsについてはバイナリ配布されていますがUNIX系はソースからビルドする必要があります。

  1. C言語のソースが配布されていますので、Mac上で展開します。
  2. 展開したソースの直下に ”INSTALL”というファイルがありますので熟読します。
  3. makeするためには”Makefile.def”というファイルが必要の模様。
    • {src_dir}/Makefile.def-samples/Makefile.def-x86_64-osx というファイルがあったのでソースディレクトリへMakefile.defという名前でCOPY
  4. makeしてmake installで使えるようになりました!

アセンブルリストの修正点

The Macroassembler ASはちょっと癖がありまして、モトローラのアセンブラの書式とちょっと違います。以下の部分を手直しする必要がありました。

修正点 修正内容
コメント モトローラ・アセンブラのコメントは 行頭の”*”で一行まるごとコメントか、ニーモニックコードにつづいて書かれています。
マクロアセンブラASはコメントはすべてセミコロン “;”で始まる必要があるので修正が必要です。
なんとなくインテルやザイログのニーモニックっぽいですね。
文字/文字列定数の書き方(FDB,FCCなど) モトローラ・アセンブラでは文字定数(FDBなど)は #’A 、文字列定数(FCC)は /ABC/ のような書き方ですが、それぞれ #’A'(閉じるクォーテーションが必要)や ‘ABC’と書く必要があります。
NAM疑似命令は無い アセンブリソースの頭についている NAM疑似命令はありませんのでコメントアウトしてください。
インデックスレジスタの参照先オフセットは省略しない MIKBUGのソースにあったんですが、 “STAA X” みたいにインデクス参照の際のオフセット省略(インデクスレジスタのポインタ先へストアとか…)は、このアセンブラでは許してくれませんでした。 “STAA 0,X”みたいに ゼロを明示する必要があります。
この記述はこっちのほうが自然ですね…

アセンブルの実行/モトローラSフォーマットへの変換

アセンブルリストの修正を行ったら、コマンドラインからクロスアセンブラを起動してアセンブルを実行します。実行コマンドは以下になります。
-Lオプションは アセンブリリスト(xxx.LST)ファイルを作成するオプションでアセンブリエラーが出た場合も場所がわかりやすいのでおすすめです。

$ asl -cpu 6800 -L xxxx.ASM

アセンブリがうまくいくと xxx.p というバイナリのオブジェクトが生成されます。これをモトローラSフォーマットテキストへ変換したいので、続いて以下のコマンドを実行します。

$ p2hex -r\$-\$ -F Moto XXXX.p

-rはアドレスを指定するパラメーターで、-Fはフォーマットを指定します。”Moto”だとモトローラSフォーマット。”Intel”だとインテルHEX形式です。
※パラメーターの”Moto”を”Mot”だと思いこんで、しばらくハマっていたのは秘密です。

これで電大版TinyBASICのソースから実行用のオブジェクトが生成できました。
これをダンプリストから作った際と同様にMIKBUGのLコマンドに読み込ませてGコマンドで起動すれば BASICが稼働します。

次は、MIKBUGやVTL言語(スタンドアロン)のオブジェクトコードとあわせてEEPROMへ焼き込みをしてみたいと思います。

モトローラ6800CPUボード(SBC6800)で電大版TinyBASICを動かす (6) テストプログラム動作確認と電大版TinyBASIC

さて、いよいよブルーバックス「マイ・コンピューターを使う」に出ていた電大版TinyBASICを動かしてみたいと思います。

テストプログラムの稼働確認

まずは、そもそも作ったマイコンボードが正しく動くか確認しなければ、というわけでデータパックで提供していただいているHELLOを表示する機械語プログラムや、マイクロBASICなどを動かしてみます。

プログラムのロード方法

SBC6800ボードの機械語モニターMIKBUGを使って機械語プログラムをメモリーへ登録する方法は2種類あります。

コマンド 操作法など
Mコマンド
  • アドレスを指定して1バイトづつ入力する。
  • 間違えたらもう一度入力し直し
Lコマンド
  • パソコン側でモトローラSフォーマット形式へ変換が必要
  • パソコン上の好きなエディタで編集が可能

特定のアドレスにパッチを当てる場合はMコマンドで十分ですが、わたしのターミナルの設定かもしれないのですがバックスペース(BS)が効かないため一度間違うとプロンプトに戻ってアドレス入力からし直しとなります。長いプログラムの入力には向きません。
大昔のマイコンでは1ビットづつのトグルスイッチと確定ボタン?で機械語プログラムを入力していたという記事も読んだことがあるので、それから見たら何を贅沢な!という話だとは思いますが…

通常は親機のパソコンでモトローラSフォーマットで流し込みデータを準備しておいて、機械語モニタMIKBUGのLコマンドで一括流し込みというのが現実的です。モトローラSフォーマット参考URLにもあるとおり以下の形式になっています。

S1+長さ(2バイト)+アドレス(4バイト)+実データ+チェックサム // メモリーへのロードデータ
S9         // ロード終了

参考 : モトローラSフォーマット

テストプログラム(HELLO.S)のロードと確認

まずデータパックにあるHELLO.Sを流し込んでみます。
適当なテキストエディタでHELLO.SをひらきクリップボードへCOPY。Lコマンドで入力待ちにした状態で内容をペーストで送信されます。
9600bpsフルスピードでもちゃんと取りこぼさないのが素敵です。

プログラムのスタートアドレスは $1F48-1F49 へMコマンドで書き込んでGコマンドで実行できます。

マイクロBASICのロードと確認

データパックにある MICBAS13.S をロードして、HELLO.Sのときと同様にスタートアドレスは $1F48-1F49 へMコマンドで書き込んでGコマンドで実行できます。

マルチステートメントなどは無いようですが、ちゃんと動くBASICがワンボードマイコンで動くと感動的です!
最終目的はブルーバックス巻末の電大版TinyBASICを動かして、可能であれば一緒に掲載されている BASICのSTARTTREKゲームを動かしてみたいので、、次に電大版TinyBASICの導入に向けた準備に入ります。

電大版TinyBASICを動かす

いよいよ電大版TinyBASICを動かしてみたいと思います。まずは、ロードできるようなSフォーマット形式をつくる準備です。

BASICインタープリタ(16進ダンプ)をテキストファイルへ

ブルーバックス「マイ・コンピューターを使う」の巻末には電大版TinyBASICの16進ダンプリストが出ています。移植に関するパッチアドレスなども詳細に出ていますのでSBC6800ポードで動作させることができそうです。
(あとでわかりましたが、他にもストレージパッチする場所が必要でした….)

まずは親機となるパソコン(私の場合はMac)のテキストエディタで以下のようなテキストファイルを作成しました。
4桁のアドレス+16進数をブランクでセパレーションした形式です。

0010 xx xx xx xx  xx xx xx xx  xx .....
0020 xx xx xx xx  xx xx xx xx  xx .....
              :

ダンプリストは書籍が数十年前のもので劣化しているのに加えて、8(ハチ)と0(ゼロ)とか、B(ビー)とE(イー)とかが判然としない印字となっていてなかなか苦労しました。ダンプリストを入力するなんで数十年ぶりで老眼の私にはきつい作業でした。
またブルーバックス「マイ・コンピューターを使う」の巻末の電大版TinyBASICの16進ダンプリストには、I/O誌やASCII誌のダンプリストのような16バイトごとのチェックサムは付いてませんでした。よって、打鍵間違いは根性で1バイトづつチェックする必要があります。

モトローラSフォーマットへ変換

入力した16進ダンプのテキストファイルをモトローラSフォーマットへ変換すれば、SBC6800の機械語モニタMIKBUGが解釈してくれそうです。
ブランクセパレーションなのでawkで変換できるのでは?! と思って書き始めたのがこちら。酷いスクリプトですがちゃんと動きました。
チェックサムを計算させるところでGNU awkのライブラリ関数でなければダメな部分がありました。素直にRubyあたりで書いたほうがスッキリした気がします。….orz

ストレージパッチ箇所

ブルーバックス「マイ・コンピューターを使う」の巻末の電大版TinyBASICの記事には色々なマイコンに移植する際の「移植用番地表」がついています。本来はソースリストが手に入ればそのあたりも一発で直すことができるのですが、最低限動かすことができそうです。(後日、bit誌のコピーを入手してアセンブルにも挑戦してみました。そちらは別記事で….)

SBC6800はMIKBUG互換版を装備しているため、電大版TinyBASICの前提はクリアしています。その部分のパッチは必要ありません。電大版TinyBASICはMC6810メモリーを前提としている部分($A000からメモリーが装備されている前提)があるためその部分はパッチが必要です。
また、古風平凡さんのページ(MIKBUG プチ拡張 (Old MC6800))に、SBC6800特有の対応としてのパッチ箇所が書かれていました。そちらも参考にさせていだきました。

バッチ箇所

バッチ箇所 パッチ内容 パッチ内容
スタックポインタ先頭($A047) x4箇所 $1F47へ変更します SBC6800では$A000⇒$1Fxx
サブルーチンスタックの先頭アドレス($A080) x2箇所 $1F80へ変更します SBC6800では$A000⇒$1Fxx
サブルーチンスタックのボトムアドレス($A04A) $1F4Aへ変更します SBC6800では$A000⇒$1Fxx
PIAの DATAレジスタをアクセスしている部分 古風平凡さんのページを参考にさせていただき、PIAアクセス部分をACISアクセスサブルーチンを呼ぶように変更が必要です。
☆この先の同じですが….参考にさせていただいたパッチ部分と、ブルーバックスのダンプリストアドレスはズレていますので、似たようなパターン部分をみつけて修正する必要があります。
[MIKBUG プチ拡張 (Old MC6800)](http://oando.web.fc2.com/old_mc6800/f100_414.htm)
メモリの読み書きテスト部分、フリーメモリ指定 古風平凡さんのページを参考に、メモリー読み書きテスト部分をNOP($01)で潰す対応とRAM使用域のエンドアドレス($1EFFへ)変更が必要です。注) 今回はROM化しないのでスタートアドレス変更($0100)は行いません。 [MIKBUG プチ拡張 (Old MC6800)](http://oando.web.fc2.com/old_mc6800/f100_414.htm)
テレタイプの CR/LF時に必要なパディングキャラクタ($FF)外し 古風平凡さんのページを参考に”$0D $0A $FFx5個 $00″という並びを見つけて $FFの最初のバイトを $00に変更しました。
ここを変更しなくても動きますが毎行 文字化けしたものが出て画面が汚くなります。
[MIKBUG プチ拡張 (Old MC6800)](http://oando.web.fc2.com/old_mc6800/f100_414.htm)

SBC6800へのプログラム流し込みと実行

パッチをあてた16進ダンプテキストファイルから、モトローラSフォーマットを生成し、MIKBUGのLコマンドを使ってSBC6800のメモリーへ登録すれば電大版TinyBASICの起動準備完了です。

$1F48〜49の起動番地設定を Mコマンドで $0100 へ設定し Gコマンドで起動します。「READY」と「#」の入力促進プロンプトが出ればOKです!!

電大版TinyBASICが動きました!! ♬