2018年7月27日金曜日

6809SBDの新しい基板を作りました

新しい基板は6809Pと6809EPの両用基板です

今までの基板は6809P用に設計したので、6809EPを搭載する際にはEPアダプターを使用していました。
これで09Pと09EPの両方が使用できて特に不都合はないわけですが、ICソケットの上にEPアダプターが重なっているのを見ていると、やっぱり何とかしたいということで、両用基板を作成することにしました。

EPアダプター上に載せていた、信号QとEを作るための74HC74を基板に移し、切り替えの3Pジャンパーを7個と6809と6309の切り替え用の1個の計8個を載せれば良いのですが、10x10cmのサイズではもうギリギリでしたが、RAMを128KBを1個にして何とか収まりました。

6809P/EP両用基板に09Pを搭載


6809P/EP両用基板に09EPを搭載


左上の2段になっている3Pジャンパー6個と2個が切り替え用です。
左端の1個は6809と6309の切り替え用で、XTAL端子(39番ピン)をGNDに落とすか開放するかを切り替えるものです。残りの7個は、全てを上に置くと09P対応、下に置くと09EP対応となります。
画像は63C09Pを搭載した例と63C09RP(EP相当)を搭載した例です。

現状、eBayなどでも本物の63C09Pは中々入手できず(秋葉原などでは買えるようですが、結構高額…)、63C09EPやRPなら比較的入手しやすいので、どちらでも使えるこんな基板もありかなと。
私の手持ちも、頂き物の63C09Pが2個で、あとはEPとRPばかりです。



6809SBD-V3回路図

回路図を示します。
10x10cmのFusionpcb特価基板ではこれが限界のようです。
現在は、もう少し大きな基板で6809/6802デュアルCPU基板を設計中です。
(これができれば、68系のソフトが全て走る...かな)



2018年7月24日火曜日

MicroCを使う(その2)・・・MC09を作成して使う

MC09の作成方法をより具体的に

「MicroCを使う(5月4日公開)」ではMC09の作成方法を説明しましたが、それは2014年に当時のUbuntuで作成した記録を元にして書いたものでした。
書いた時には、現在使用しているUbuntu16では作成できないようだとは思っていましたが、本当にできないのかどうかを確認していませんでした。
その後、Ubuntu16や最新の18で試みてみましたが、どうしてもうまくいきませんでした。
ということで、以前のバージョンのUbuntuをインストールして、改めてMC09を作成しました。
インストールしたのは、Ubuntu10で、使用したisoファイルはUbuntu-10.04.4-desktop-i386.isoです。(ドジってしまって、Windows7とUbuntu16のデュアルブートで動作していた環境を壊してしまった...(泣))

Ubuntu10上で、前回の説明のように竹岡さんのサイトからmc09.tgzとas09.tgzをダウンロードし、それぞれを展開します。私は、デスクトップにmc09_as09というフォルダを作り、その中にmc09, as09というフォルダを作ってその中に展開しました。

ファイルを収めたフォルダ




(1)6809用アセンブラas09を作成する

フォルダas09中に展開されたファイルの中にmakefileがありますので、基本的にはその通りにビルドしていけばよいのですが、BSD用のファイルですのでLinuxでは以下の修正が必要です。

as09用makefile(修正後)

・makefileのCFLAGS=の次行にcc=gccを追加する。
・関数名のバッティングを避けるために次の2関数の名称を変更する。
  as68.c中のgetline()を全てgetline2()に変更
  as68.c中のindex()を全てindex2()に変更
修正した後、makeを実行すると実行ファイルas09が作成されます。
(makefile中のlint:...行以降は実行されませんが、結果には影響ありません。)

as09作成後
このas09をフォルダmc09にコピーしておきます。


(2)mc09を作成する

フォルダmc09に移動します。以降はこのフォルダで作業します。
makefileを修正します。
・DESTDIR=の次行に cc=gccを追加する
・mc mc2.cの先頭に ./を追加する ./mc mc2.c
・as09 c.txt -o mc2.o -v -Oの先頭に ./を追加する ./as09 c.txt -o mc2.o -v -O
・関数名のバッティングを避けるために次の2関数の名称を変更する。
  mc.c中の getline()を全て getline2()に変更
  mc.c中の index()を全て index2()に変更


mc09用makefile (修正後)


ここまでの変更で、makefile中のgcc mc.c -o mcでmcが作られる。
このmcはLinux上でのクロスコンパイラとして使用できるものですが、
このままでは、コンパイルはできても出力(C.OUT)が得られません。
さらに次の変更をします。
・mc.c中の printf( を全て fprintf(obuf, に変更する。

以上の変更によって、makefile中の
gcc mc.c -o mc でクロスコンパイラ mcが作られ、そのmcを用いた ./mc mc2.c でmc2.cをコンパイルした結果の c.out(6809のアセンブラ言語)が得られるので、これを./as09 c.txt -o mc2.o -v -O で6809の機械語にアセンブルすることでFlex上での実行ファイルmc2.o(モトローラS形式)が得られる。(c.outは c.txtのアセンブル中に読み込まれて一緒にアセンブルされる。)
(各行ごとの実行でなく、makeを実行した場合は lint:...行以降は実行されませんが、結果には影響ありません。)


4通りのmc2.o作成後


最後に、mc2.oをS形式からバイナリに変換して、Flexに読み込ませて名称をMC09.CMDに変更すれば出来上がりです。私は、以前公開した CvtMotHexBin.exeでバイナリに変更し(StartAdr, ExeAdr共に0x0100に設定)、FlexDrvWin.exeに放り込みました。

蛇足
アセンブラ as09のオプション -vと -Oの効果が良く分からなかったので、オプションなしの場合(mc2.o)、-vのみ付けた場合(mc2v.o)、-Oのみ付けた場合(mc2o.o)、-vと-Oの両方を付けた場合(mc2vo.o)の4通りを作成してみました。
結果:mc2.oとmc2v.oは同じでバイナリで31KB、mc2o.oとmc2vo.oは同じで29KBでした。-Oはサイズの最適化と思われますが、-vは分かりませんでした。

あとは、前回説明しましたように、
C.TXT、そしてライブラリc.txt, stdio.txt, stdio2.txt, alloc.txt, fileio.txt, fileio2.txt. scanf.txt, string.txt、そしてユーティリティuf.cをFlexのドライブにコピーすれば完成です。(ライブラリはドライブ0のシステムディスクに、C.TXTはドライブ1のワークディスクにコピーします。)コンパイルするファイルはC.TXTのあるワークドライブに作成します。この配置で、例えば
MC09 (sp) -O1.C.OUT (sp) file.c (sp)はスペース
で、file.cがコンパイルされてC.OUT(6809のアセンブル言語)が作られるので、Flex上のアセンブラASMB.CMDで
ASMB (sp) C (sp) file.CMD +YLS (CはC.TXTのこと)
でアセンブルされた実行ファイルfile.CMDができあがります。
これは$100からに配置されて$100から実行開始されるファイルです。

MC09を使う際の注意

前回も書きましたが、追加も含めてもう一度書いておきます。
(1)ソースファイル作成では
・必ず stdio.txt, alloc.txt をインクルードする。ファイル名は大文字で。
 #include "STDIO.TXT"
 #include "ALLOC.TXT" (入れないとアセンブル時に initheapエラーが出る)
・TABコード($09)はFlexでは意味が異なるので、スペースに変換しておく。
・行末コードは$0Dのみなので、Windows上でファイルを作成した場合は$0D,$0Aの$0Aを削除してからFlexに転送する。

(2)関数の引数の書き方では
古いコンパイラですので、引数のタイプを次行に書くというKRスタイルです。
 例 main (argc, argv)
       int argc;
       char *argv[];
   {

   }

古いスタイルで書かなければならないことやエラーメッセージが不親切など、使いにくい面も多々ありますが、特にファイルI/Oのあるユーティリティなどを短時間で書きたい時などには便利ではないかと思います。

以上ですが、Linuxのどのディストリビューションのどのバージョンで作成できるかは、私にはとても確認できませんので、私の作成したサイズ31KBのMC09.CMDと29KBのMC09O.CMDの両方と、古いスタイルのCファイルの例として自作コマンドLISTN.CとMOT2CMD.CをMicrosoftのOneDriveに上げておきます。




2018年7月6日金曜日

FLEXシステムの作成方法(その3)・・・6800FLEXの場合

FLEXシステムの作成方法(その3)・・・6800FLEXの場合


6月27日に6809FLEXシステムの作成方法を説明しましたので、今回は6800用FLEXシステムの作成方法を説明します。

今更、誰が6800FLEXなんか使うんだという声もあるとは思いますが、マイコン初期の頃にVTL, TinyBasic, GAMEⅢ, TL1などのアマチュア的な言語に夢中になった思い出がある方もおられると思います。私もそうでした。
それらの言語を動かすためには、やはり、OSがあると何かと便利です。
(ディスクに保存しておいて起動して走らせるだけなら、WindowsパソコンにMOT形式で保存しておいて、MonitorのLoad, Saveコマンドで済むわけですが...)

それはそれとして、6800でもFLEXを動かしてみたいという、技術的な興味もあって6800FLEXを作成してみました。

6809の場合と同様に、SWTPCemu中の6800フォルダにあるDSKファイルからFLEX2.SYSを取り出して、それを元にFLEX2.CORを作ります。FLEX2.SYSは色々なDSKファイル中にありますが、Flex2-01.DSK中のものを使用することにします。このDSK中にはFLEX.CORやFLEX.SYSもありますが、これらは古いもののようですので使用せずにFLEX2.SYSから作ることにします。

具体的な手順

(以下のすべての数値は16進数表記です。)
 (1)FLEX.CORを得る
画像1 ディレクトリ

FLEX2-01.DSKをバイナリエディタで開き、アドレス410からのディレクトリを見ると、FLEX2.SYSはセクタのトラック、セクタ番号が01,0A~04,04の18セクタであることが分かります。

アドレスでは1300~2BFFですので、これをコピーして取り出してFLEX2.SYS名で保存します。



画像2 FLEX2.SYSの先頭部







画像3 FLEX2.SYSの最後尾




このFLEX2.SYSの最後尾を見ると、最後の3セクタが独立しているように見えます。
アドレス2900からの2セクタがDriver.bin、2B00からのセクタがI/Oのベクターです。

この3セクタを除いて282FFまでを取り出して保存したものがFLEX2.CORとなります。













(2)driver.bin, io.binを用意する
MicrosoftのOneDriveに必要なdriver.txtとio.txtを上げておきますので、それをダウンロードして、同梱の6800AsmWin.exeでアセンブルするとdriver.binとio.binが得られます。
6809FLEXとは異なり、このdriver.bin中にI/O関係のアドレスを書きます。
driver.txtを見ていただくと分かるように、BE80から始まるDriverのベクターの後ろ、アドレスBEA3に相当する個所からF000(INCH), F002(OUTCH), BEAFの位置にF838(MONITOR)を書き込んでおきます。
(実は、これだけではだめで、上書き用の io.txtも必要です。)


(3)BINファイルをパケット形式に変換する
得られたBINファイルをパケット形式に変換します。その方法は前回述べた通りで、空のDSKファイル(BLANK.DSK)を用意して、それをFlexDrvWin.exeのドライブにセットし、そこにbinファイルをドラッグ&ドロップするだけです。これで自動的にパケット形式に変換され、セクタ先頭にもセクタ情報が付加されます。

(3-1)driver.binを変換する
画像4 driver.bin と io.bin
FlexDrvWin.exeのStart Adrのボックス中の値を0xBE80にセットしてからdriver.binをドラッグ&ドロップします。実行アドレスは0x0000のままで良いので「はい」と答えるとdriver.binが指定したアドレスからのパケット形式で保存されます。
保存したBlank.binをバイナリエディタで開くと、アドレス2000からの2セクタに保存されていますので、これをコピーして取り出し、driver_dsk.bin名で保存します。

(3-2)io.binを変換する
6809の場合のconsole.binとは異なり、6800ではI/O関係のベクターはここではなく、driver.binの中に書いてありますので、これで十分なはずですが、このio.binは起動時の最後に読み込まれてdriver.bin中の値にセットされたメモリ上の該当箇所を更に上書きするためのもののようです。
(これが分からなくて、ずいぶん手間取りました。)
FlexDrvWin.exeに入れるときに、Start Adrを0xAD09に、Exec Adrを0xAD00にセットします。
この1セクタ分をコピーして取り出し、io_dsk.bin名で保存します。


(4)FLEX.CORにdriver_dsk.binとio_dsk.binをつなげる
新しいBLANK.DSKを用意し、FLEX2.CORを2000~35FFにコピーします。
その後ろの2セクタにdriver_dsk.binを、さらにその後ろの1セクタにio_dsk.binをコピーします。

(5)セクタ情報を書き換える

画像5 FLEX2.SYSの先頭部(左)と最後尾(右)
これで全セクタが揃ったので、各セクタ先頭のセクタ情報4バイトを整理します。
アドレス2000からの各セクタの先頭4バイトを、
01,02,00,01
01,03,00,02
      ...
01,19,00,18
00,00,00,19
に書き換えます。



(6)セクタ00,03のSIR(システムインフォメーションレコード)情報を書き換える
セクタ00,03(アドレス200)のオフセット1Dからの未使用領域開始セクタを01,1Aに、オフセット21からの残りセクタ数09,E0を09,C7に書き換えます


画像6 SIR情報




(7)セクタ00,05のディレクトリ情報を書き換える
セクタ00,05(アドレス400)のオフセット10からの24バイトをファイル名(8バイト)、拡張子(3バイト)、アトリビュート(1バイト,通常00)、未使用(1バイト,00)、スタートTrk,Sct(2バイト,01,01)、エンドTrk,Sct(2バイト,01,19)、サイズ(2バイト,00,19)、2バイト(00,00)、日付(3バイト,月,日,年を2進数で) のように書き込みます。

画像7 ディレクトリ


(8)最後に
以上でシステムディスクのベースが完成しました。あとは、SWTPCemuから必要なCMDファイルが入っているDSKファイルを探してFlexDrvWin.exeのドライブにセットして、システムディスクにコピーします。
例えば、COPY.CMDが入っているDSKがドライブ2に、コピーしたいCMDファイルが入っているDSKがドライブ1にセットされているとして、
  2.COPY (sp) 1 (sp) 0 (sp) .CMD (spはスペース)
でCMDファイルが全てドライブ0にコピーできます。
詳しくは、Documentationフォルダ中のTSCフォルダにあるドキュメントを参照してください。

(9)その他
・システムディスクの先頭2セクタ00,01と00,02にはBootLoaderを入れておく必要があります。6800用のモニター中のFLEXコマンド「X」は、この2セクタを読んでA100からにセットして実行を移す機能を持っています。(このBootLoaderのオフセット05,06にFLEX2.SYSの先頭セクタのTrk,Sct番号が書かれています。FLEXのLINKコマンドはSYSファイルを探して、その位置をここに書き込んでいます。これによって、SYSファイルがDSK上のどこにあっても正しくBootできるわけです。)

・AC07の値00を08に書き換えておくとBSキー時に削除文字が消えてくれますので、使い勝手が良くなります。このためにFLEX2.CORの先頭からのオフセット0F(アドレス200F)を08に変更します。

以上の作業に必要な、BootLoaderの入ったBLANK.DSK、driver.txt, io.txt, 6800AsmWin.exeをMicrosoftのOneDriveにMakeFLEX2というファイル名でアップしておきます。