2019年6月12日水曜日

FM77用の拡張IOボード、ROM/RAMディスクボード

FM77用の拡張ボードを紹介します


最近はソフトの手直しばかりで、とりたてて紹介するものがありません。そこで、以前製作して今でも使用しているFM77用の拡張ボードを紹介します。
このボードのために制作した、Windows上で仮想ドライブを実現するソフトFlexDrvWin.exeがこのブログのシングルボードマイコンを製作するベースとなったと言えるものです。

製作したのは、FM77AV40SX用のIO拡張ボードとROM/RAMディスクボードです。
私はFM77AV40SXでFLEX09とOS-9Level2を使用しているのですが、2DDフロッピーはかなり遅く、また、ドライブもメディアもいつまで使えるのかも分かりませんので、何とかFDDと縁を切りたいと思っていました。

色々と考慮した結果、手持ちのFM-7とFM77AV40SXに共通して装備されている50ピンのIO拡張コネクタを利用して、まずIO拡張ボードを作り、それに接続する形のROM/RAMディスクを製作することとしました。

製作したIOボードとROM/RAMボードを下に示します。

下がIO拡張ボード、上がROM/RAMボード

上部の空ソケットには512KBのSRAMを装着してRAMディスクとして利用していましたが、後述のようにWindows上の仮想ドライブに切り替えたので不要となりました。

左がIO拡張ボード、右がROM/RAMボード

今では、こんな配線をする気力はもうないかも...

それぞれの裏面配線の様子



ROM/RAMボードの構成を下に示します。
RAM/ROMボードの構成


6821によるROM/RAMディスクのアクセス方法を下に示します。
6821によるTrk,Sct番号のセット方法


IO拡張ボードには、6821PIA、6850ACIA、6840PTMが搭載してあり、6850にはRS-232Cシリアルインターフェースが、6821にはFT-245パラレルインタフェースが接続してあります。どちらも38400baudです。
ROM/RAMボードには、512KBのROMとRAMのペアが2組あり、それらを6821PIAが制御しています。RAMはバッテリバックアップしてあります。
ROM/RAMディスクの容量は
 4Mbit(512KB)では Trk 64、Sct 32 で(64-1)*32=2016セクタ
 2Mbit(256KB)では Trk 32、Sct 32 で(32-1)*32=  992セクタ
 1Mbit(128KB)では Trk 16、Sct 32 で(16-1)*32=  480セクタ
となります。

2組あるのは、FLEX09用とOS-9用で、それぞれをスイッチで切り替えて使用します。
(端にあるソケットはROMライターですが、未完成です。)

記録を見ると、2014年12月末から作り始めて2015年3月初めにハードは完成していますが、実用になる制御ソフトの完成には年末近くまでかかっています。

最初はROM/RAMディスクとして使用


FLEXでは実質4台までしかドライブが接続できないので、
ドライブ0:内蔵ドライブ0
ドライブ1:内蔵ドライブ1
ドライブ2:ROMディスク
ドライブ3:RAMディスク
として利用することになります。
内蔵ドライブ0のシステムディスクで起動し、その後、システムドライブを2に、ワークドライブを3に切り替えれば、フロッピーを使用せずに済みますので、結構快適になりました。

最初はシリアル/パラレルのインターフェースは実装していなかったのですが、ROM/RAMディスクのみでは結局、データ保存にフロッピーが必要なので、Windows上の仮想ドライブも追加することにしました。
FT-245モジュールを搭載しているのは、Windows上の仮想ドライブとパラレルインターフェースで通信したかったからで、作る前は、シリアルインターフェースでは遅くて実用にならないからパラレルでと思っていたのですが、実際に製作してみると、確かに転送速度は10倍以上違うのですが、DISKの読み書きに時間がかかるのでトータルの時間は少し速い程度であると分かりましたので、現在はシリアルも使用しています。

その時に制作したのが、6809シングルボードコンピュータでWindows上の仮想ドライブを実現しているFlexDrvWin.exeというソフトの原型で、このソフトのドライブ3にDSKファイルをセットすればFM77AV40SX上のFLEX09で読み書きできます。(OS-9の場合は別ソフトのOS9DrvWin.exeを使います。)

ドライブ3をRAMディスクからWindows上の仮想ドライブに変更


動作中の様子を示します。
手前がFM77AV40SXのディスプレイとキーボード、後方がWindows機です。
後方右上のWindows上のFlexWinDrvの画面で分かるように、ドライブ3にセットした仮想ディスクを読んでいます。


動作中の様子

画面表示


この拡張ボードによってデータ等はフロッピーでなくWindows上のファイルとして保存できるようになったのですが、起動時はフロッピーが必要です。これを解決するためにはフロッピーエミュレータが必要ですが、まだ製作できていません。。。

ドライブ2も仮想ドライブに変更


現在は、FLEX09システムのドライバールーチンをさらに書き換えて、ドライブ3だけでなく2もWindows上の仮想ドライブに設定変更をしていますので、FlexWinDrvのドライブ2と3に仮想ディスクをセットして使用しています。(結局、ROMディスクもRAMディスクも使わなくなってしまった。。。)

[蛇足]画像で分かりますように、FM77AV40SXの純正キーボードは使用せず、大切に保管してあります。代わりに、自作のキーコード変換器を接続したPS/2キーボードを使用しています。さらに、内蔵ドライブも取り外して保管し、代わりに一般的なDOS/V機用のFDDを装着しています。
自作のキーコード変換器は下の画像のものです。
ATtiny85を使用したハードは簡単なものです。ソフトには結構苦労しましたが、FM77AVのスキャンコードをですくまさんが調べて公開してくださっていたので、とても助かりました。感謝いたします。

自作のキーコード変換器


資料の整理を兼ねて、手配線のボードをプリント基板化しようと考えています。無事に完成したら公開するつもりです。

2019年5月23日木曜日

SBC6303に自作6802ボードのモニタープログラムを移植

SBC6303に自作6802ボードのモニタープログラムを移植しました


しばらく前にSBC6303を製作していじっていたのですが、LILBUGがどうも手になじまず、結局、使い慣れている6802/6809ボード用のモニターを移植することにしました。
モニターのサイズが4KByteありますので、SBC6303ボードとBLボードを接続して32KByteのRAMを増設する必要があります。

6801系の命令は6800系の命令より拡張されており、特にXのPUSH,PULLとCPXのフラグ対応が有難い拡張で、プログラムがかなり組みやすくなっています。
Windows上でアセンブルしてできたMotorola S-formatのファイルをSDに書き込んでセットし、Arduino Proのリセットボタンを押すとSD内のファイル一覧が表示されます。
そこでSBC6303ボードのリセットボタンを押すとファイルが表示順に起動します。下の画像では、最初にLILBUGが起動し、さらにリセットボタンを押すことで6303MONが起動しています。

起動画面とコマンドリスト

コマンドリストは画像の通りです。私の自作ボード用のモニターとの違いはLoad,Saveコマンドです。
機能を同等にしたかったのですが、内蔵シリアルインターフェースが一つしかないのでLoad,Save機能は同等にできません。やむを得ず、LoadはTeraTermのファイル送信機能を利用することとし、Saveは画面にMotorolaのS-formatで表示し、それを画面からコピペでWindowsに保存することとしました。(従って、SaveではなくPunchコマンドです。)
コマンド入力ラインではASSIST09と同様に、アドレスは何桁入力しても最後の4桁のみが有効で、データでは最後の2桁のみが有効です。

Loadコマンドは、L(Retern)と入力した後、TeraTermの「ファイル送信」でLoadしたいファイルを指定します。
なお、Loadコマンドでは、9600baudは遅いので、TeraTermの送信遅延を下の画像のように設定する必要があります。


Loadコマンドの設定

Load中は、S-formatファイルの各行の先頭アドレスが表示されますので、どこまで読み込んでいるかが分かります。最後に実行アドレスが(あれば)表示されます。


Loadコマンド

Punchコマンドでは、Pに続いて開始アドレスと終了アドレスを入力します。実行アドレスは入力してもしなくても構いません。下の画像のように画面にS-format形式で表示されますので、これをコピペしてWindows上で名前を付けて保存します。

Punchコマンド

最後に


6801系のプログラムは6800よりもかなり組みやすくて良いのですが、ベースページの$00から$14までをCPUが使っているので、アプリケーションでの使用が制限されてしまうのが残念です。これさえなければ、6802を捨てて移行できるのに。。。

移植にあたっては、結構引っかかることが多く、アセンブルしては走らせて、結果を見ては修正を繰り返しました。最初はEP-ROMを1ダースほど並べて焼いては取り付けて実行・修正を繰り返していましたが、途中でSDに書き込めばよいと気づいてからは、かなり効率が上がりました。それにしても、SD中のファイルをリセットで順に起動するというVintagechipsさんのアイディアには感心しますね。
(なお、アセンブラですがツールは全て自作するという方針を一時棚上げにして、arcpitさんのX6801を使用させていただきました。感謝です。)

出来上がったSBC6303用のモニタープログラムのソースとS-formatをOneDriveに上げておきます。S-formatファイルをそのままSDに書き込めば動作します。ソースをつけておきますので、より使い易いように改造も可能です。

これで、6800,6809,6303で共通した操作性で扱うことができます。
また、Leo_yumesichiさんがSBC6800,SBC6809に移植されたので、68系のSBCで同じ操作性のモニターが動くことになりました。(使われる方がどれだけあるのかは疑問ですが。。。)

2019年5月14日火曜日

SBC8080でmcroPASCAL80を走らせる

SBC8080(CPUボード+SUBボード)でmicroPASCAL80が走りました


4月27日のブログで、SBC8080でGAME80が動作したと報告しましたが、それを見てくださったskyriverさんが、CP/M80上でGAME80インタプリタだけでなく、コンパイラも走らせました。それを参考にして、私のSBC8080でもコンパイラを走らせることができました。

GAMEIIIは68系で使用していましたが、アセンブラよりも手軽にコンピュータを自由にあやつれるのはとても魅力的ですが、プログラムの可読性がいまいちだなと思うのは私だけでしょうか。(私が慣れることができなかっただけ?)その頃はUCSD PASCALにあこがれていましたね。

GAMEIIIより1年半ほど後に、丸山定信さんによりASCII誌(1980年1月号)にmicroPASCAL80が発表された時は、68系の私はうらやましくてただ指を銜えて見ているだけでした。
ようやく11月号に河崎道明さんによってmicroPASCAL68が発表され、当然私も5KB近いバイナリを頑張って入力しました。今でも、私の自作6802基板で動いています。

今回、SBC8080基板を製作し、GAME80が動いたので、当時あこがれていたmicroPASCAL80も走らせてみることにしました。
丸山さんの発表ではソースリストも掲載されていたのでアドレス変更も含めて楽勝だと思ったのですが、当時の放電プリンタの文字には悩まされましたね。
動くことは動くのですが、変数の代入ができないという変な状況に悩まされましたが、何回も見直した結果、ソースの入力間違いが一文字あるのをようやく見つけ、それを訂正して無事に動作しました。

ということで、GAME80インタプリタ, GAME80コンパイラ, microPASCAL80の3つをSBC8080SUBボード上のROMに入れ、モニタから自作のLoadコマンドで選択・実行する形で仕上げました。

(1)GAME80インタプリタ 元がソースでなくバイナリなのでそのままのアドレス8600hからのバイナリファイルをROMの7800hからに収めるようにHEXファイルに変換します。→ GAME80-7800.hex
(2)GAME80コンパイラ 元はGAME80のプログラムですからGAME80インタプリタの動作中に読み込めばよいのですが、その手間を省くために、予めメモリ中の保存形式に変換してROMに収めておき、メモリのA000hからに転送します。ROMの6000hからに収めるようにHEXファイルに変換します。保存形式への変換は前回のブログで公開したCvtMotHexBin.exeを使っています。→ GAME80C-6000.hex
  [5月25日訂正]変換用のプログラムはCvtMotHexBin.exeではなくChglno.exeです。
(3)microPASCAL80インタプリタ 元がソースですのでオリジナルの2000hからの開始アドレスを8000hに変えてアセンブルします。できたバイナリをROMの4800hからに収めるようにHEXファイルに変換します。→ MPas80-4800.hex
(4)Loader ソースは7F00hからですので、そのままアセンブルしてHEXファイルに変換します。 → LOADER.hex
(保存形式への変換、HEX形式への変換には前回のブログで公開した自作のChglno.exe, CvtMotHexBin.exeを使っています。)


ROM中の配置図


[5月16日訂正]上図中のGAME80インタプリタとGAME80コンパイラの位置が入れ替わっています。正しくは、コンパイラが6000hからで、インタプリタが7800hからです。

これら4つのHEXファイルを、SBC8080のdatapck中のPTBEXSA.HEXファイルの後ろにつけてROM用ファイルの出来上がりです。

各ファイルの変更点をまとめておきます。
(1)GAME80 4月27日公開の「SBC8080でGAME80がようやく動作しました」に書いた通りです。
(2)GAME80C skyriverさんのブログにありますような変更・修正を加えます。
(3)MPas80 以下に変更・追加部分を示します。 

オリジナル
 2792 32D9 CDC003       BREAK:     CALL     PLIN
 2793 32DC FE03                    CPI      03H
 2794 32DE C0                      RNZ
 2795 32DF C30320                  JMP      START2
 2796                   ;
 2797 32E2 CDB903       GETCH:     CALL     GETCHR
 2798 32E5 CAE232                  JZ       GETCH
 2799 32E8 C3DC32                  JMP      BREAK+3

変更・追加部分
 2793 92D9 CDFA92       BREAK:     CALL     PLIN
 2794 92DC FE03                    CPI      03H
 2795 92DE C0                      RNZ
 2796 92DF C30380                  JMP      START2
 2797                   ;
 2798 92E2 CDF792       GETCH:     CALL     GETCHR
 2799                   ; JZ GETCH
 2800 92E5 00                      NOP
 2801 92E6 00                      NOP
 2802 92E7 00                      NOP
 2803 92E8 C3DC92                  JMP      BREAK+3
 2804                   
 2805                   ;++++++++++++++++++++++++++++++++++++++
 2806                   ;*  I/O ROUTINE
 2807                   
 2808 92EB F5           PUTCHR:    PUSH     PSW
 2809 92EC DB01         PUT0       IN       01H
 2810 92EE E601                    ANI      01H
 2811 92F0 CAEC92                  JZ       PUT0
 2812 92F3 F1                      POP      PSW
 2813 92F4 D300                    OUT      00H
 2814 92F6 C9                      RET
 2815                   
 2816 92F7 C37C00       GETCHR:    JMP      007CH
 2817                   
 2818 92FA 3E00         PLIN:      MVI      A,00H
 2819 92FC C9                      RET

(4)Loader 公開するファイル中にソースも入れてあります。(転送ルーチンは、松本吉彦著「私だけのマイコン 設計&製作」中の8080の解説から借用しました。)
(1),(2),(4)のいずれも、入力ルーチンはモニタ内のルーチンを使用しています。

下の画像は、起動・動作の様子です。例として入力したプログラムはmicroPASCAL68の記事中の階乗の計算プログラムです。

起動・動作画面

これで68基板と同様にGAMEとmicroPASCALという2つの言語が使えるようになりましたので、8080の機械語に触れずにSBC8080で遊ぶことができそうです。

(1)GAME80のバイナリとHEXファイル
(2)GAME80Cのメモリ保存形式に変換したものとそのHEXファイル
(3)MPas80のバイナリとそのHEXファイル
(4)LoaderのソースとバイナリのHEXファイル
と、これらを1つにまとめたものをOneDriveに上げておきます。

今となっては、誰でもが普通に高級言語が使えますので、GAMEやMicroPascalにそれ程の魅力は感じられないかとは思いますが、40年近く前に、信じられないぐらい機能的には貧弱なコンピュータ上でこれらの言語が動いていたことを思い返すと、感無量です。

2019年5月8日水曜日

6802基板でGAME68コンパイラを走らせる

自作6802基板でGAME68コンパイラが動作しました


前回のブログで8080SBCでGAME80インタプリタを走らせることができたと報告しましたが、それに関連して、skyriverさんがCP/M上でGAME80コンパイラを動作させたとの連絡をいただきました。そこで、私もskyriverさんのブログを参考にしてGAME80コンパイラを走らせることができました。
中島聡さんが作られたこのGAME80コンパイラは、TK-80BSの他にもいろいろなマシンに移植されましたが、残念ながら68系にはなかなか移植されませんでした。
そんな中、ついにASCII誌1981年5月号で松島義明さんがH68用のGAME68コンパイラを発表されました。
私はGAME3を使用していたこともあり、このコンパイラを動かしたかったのですが、残念ながら当時の手作りマイコンでは動作させることはできませんでした。

しかし、現在の自作の6802基板なら可能ではないかと思い、移植してみることにしました。
現在の自作6802基板では既にGAME3が動作していますので、保存してあったASCII誌から手入力してみました。ASCII誌がない方も、作成者がブログで公開されていますので心配はありません。(後述します)

[1]必要なファイルを作成する


入力したファイルは、
・コンパイラのソース(GAME3のプログラム形式 $3E00~)
・リロケータブルサブルーチンパッケージ(バイナリ形式 $3C80~$3DAA)
・サブルーチンパッケージリロケータ(GAME3のプログラム形式 $3C00~)
の3つです。
私はこの3つを1つにまとめたファイルを作り、GAME3インタプリタと共にあらかじめ読み込ませる形で使用しています。ただし、GAME3のプログラムはメモリ中では行番号が2バイトバイナリに、行末の改行コードは$00に変換され、ファイル末には$FFが追加された形式で格納されますので、プログラムリストを予め変換しておく必要があります。
手順を下に示します。

コンパイラの作成手順

変換作業はWindows上で、Chglno.exeとCvtMotHex.exeを用いて行います。
例としてGAME3インタプリタの開発者の大西さんが用意されたサンプルであるACURVEというプログラムの処理を下に示します。


処理前のソースプログラム


Chglno.exeで変換します



処理後のソースプログラム


アドレスを指定してHEXファイルに変換して出来上がり


[2]コンパイルの手順


(1)GAME3インタプリタとGAME68CAコンパイラをメモリに読み込みます。
(2)GAME3インタプリタを起動します。
(3)ソースを読み込むアドレスを指定します。
    例 =$1500
(4)コンパイルしたいプログラムを入力します。
    手入力しても良いですが、コンパイラソースと同様に処理してあればファイル
    から読み込めます
    例 GAME3の最初の例である ACURVE
(5)コンパイラを起動します。
   最初に読み込んであるので、そのアドレス$3E00を指定するだけです。
    =$3E00 とアドレス指定して #=1 で起動します。
(6)以下はASCII誌の説明通りに進めます。
   GAME:に対しては $1500
   SUB:に対しては $2100
   STAT:に対しては$222B
   WORK:に対しては$1900
   STAC:に対しては$2080
   と入力するとコンパイルが始まります。
(7)サブルーチンを$2100からに移動します。
   =$3C00 とアドレス指定して #=1 で起動します。

[3]コンパイルしたマシン語を実行する


先頭の$2100 からがサブルーチンパッケージで、実行開始アドレスは $222B
   ですのでGAMEのダイレクトモードで >=$222B で実行できます。

ちょっと見苦しいですが、画面のテキストのコピーを下に示します。



+++OLOAD GAME3.CMD     FLEXに保存してあるファイルをメモリに
+++OLOAD GAME68CA.BIN   読み込んで
+++OLOAD ACURVE.BIN
+++

M6800 MONITOR Ver6.1     いったんモニタに戻って

>G 103             GAME3を起動(ソースが既にメモリ中にあるのでホットスタート)

*READY

:=$1500            コンパイルするプログラムのアドレスに

*READY            変更すると

:0               確かにソースが読み込まれている

   70***************************
   80*    A CURVE
   90***************************
  100 X=7 Y=0 Z=2
  110 Y=Y+Z X=X+Y
  120 ;=+Y=6 Z=-Z
  130 J=1,32
  140 $=(J=X*"*")+(J<>X*".")
  150 @=J+1 / #=110
  160**************************

*READY

:=$3E00            コンパイラのアドレスに変更して

*READY

:#=1              コンパイラを起動する

GAME:$1500          (入力)

48 BYT (10LINE)

SUB :$2100          (入力)

 END 222A

STAT:$222B          (入力)

WORK:$1900         (入力)

STAC:$2080          (入力) コンパイルが始まる

   70     222B     1500
   80     222B     151E
   90     222B     152D
  100     222B     154B
  110     223F     155A
  120     2257     1569
  130     2277     1578
  140     2287     1582
  150     22BC     159C
  160     22DC     15AD
   70     222B     1500
   80     222B     151E
   90     222B     152D
  100     222B     154B
  110     223F     155A
  120     2257     1569
2277
  130     2277     1578
  140     2287     1582
  150     22BC     159C
223F
  160     22DC     15AD
 SIZE: 177(222B-22DB)

END             正常に終了

*READY

:=$3C00           サブルーチン移動プログラムのアドレスに変更して

*READY

:#=1             実行 (資料ではここでアドレスを入力することに

                    なっているが、問い合わせてこない)

*READY            これでコンパイル&サブルーチン移動が完了

:>=$222B          できたマシン語を実行

........*.......................
............*...................
..................*.............
......................*.........
........................*.......
........................*.......
......................*.........
..................*.............
............*...................
........*.......................
......*.........................
......*.........................
........*.......................
............*...................

----------------------------------- 以上 -------------------------------------------

[4]終わりに


説明不足で良く分からないところがあったと思いますが、心配ありません。
何と、GAME68コンパイラを開発された方が、ブログで資料を公開されています。
詳しくはそちらを参照ください。
開発された方は、このコンパイラを仕事にも使われていたとのこと、スゴイです。

なお、開発された方が許可してくださいましたので、私が誌面から入力したコンパイラソース等のリストをOneDriveに公開いたします。入力ミスは多分ないと思いますので、どうぞご利用ください。また、使用したツールソフト(Chglno.exe, CvtMotHexBin.exe)も同梱しておきます。

2019年4月27日土曜日

SBC8080でGAME80がようやく動作

SBC8080でGAME80がようやく動作しました


4月20日のブログでGAME80が動作しませんと書きましたが、ようやく動作しました。
INCH, OUTCH, ROLCATルーチンを色々と書き直してみたり、入力したバイナリリストを何回も見直してみたりしましたが、結果は変わりません。
ついにはSBC8080付属のモニタの逆アセンブル機能を用いて、リストをプリントアウトして読もうとしてみたりしましたが、やっぱり原因はわかりません。

ただ、TeraTermの改行の送信コードをCRからLFに変えると、改行が多くなりすぎるものの一応動作することを見つけていたので、プログラム内での改行コードの扱いに関係しているという見当をつけてリストを眺めていました。

そんな時に、元記事中の変更する可能性のあるデータ(表1)の中に、CRコードが0Ahであると書かれているのに気づきました。(もっとちゃんと読んでおくべきでした...)
ということで、アドレス8C77hの値を0Ahから0Dhに変更することで無事に動作しました。


起動手順

メモリダンププログラムを入力してみました

その実行画面


追加変更した箇所


INCHルーチンはモニタの割り込みを使用した入力ルーチンを利用したので、ROLCATルーチンは不要となりました。

以下に変更・追加箇所を記しておきます。
************************************************
変更箇所
(1)8C77 0D
(2)8C96 CD 7C 00     CALL  007C
(3)8C99 C3 9F 8C     JMP    OUTCH
(4)8C9C C9 00 00     RET NOP NOP
(5)8797 CD 96 8C
    87A2 CD 96 8C
追加箇所
OUTCH 8C9F F5 PUSH PSW
             A0 DB 01 IN 01H
             A2 E6 01 ANI 01H
             A4 CA A0 8C JZ 8CB9
             A7 F1 POP PSW
             A8 D3 00 OUT 00H
             AA C9 RET
************************************************

動作したという報告だけでは、ああそうですかという話でしかないので、まだ変更すべき点がありますが(配置アドレスの変更、プログラムの格納アドレスの変更、第1・第2スタックの変更などSBC8080に合わせる改造が必要)、とりあえず現行のもののバイナリリストと逆アセンブルしたリストOneDriveに上げておきます。

[4月30日訂正]逆アセンブルしたリストまで公開するのはまずかったと思いますので、バイナリリストのみの公開に変更しました。

次は、MicroPascal80かな。


2019年4月20日土曜日

6809基板にLISP09をインプリメント

自作6809基板にLISP09をインプリメントしました


SBC8080にGAME80をインプリメントする試みがうまく行かず中断していますので、
自作の6809基板の方にLISP09をインプリメントしてみました。

LISP09は図書館から借りた「別冊トランジスタ技術 6809オールマイティ」に掲載
された芹沢照生さん作成のもので、アセンブルリストが23ページもありましたが
頑張って入力してみました。
このLISP09はFLEX09上のソフトとして作成されていますので、入力するだけで無事に
動作しました。
FLEX09上でLISP09と入力することで起動します。解説に載っていたサンプルプログ
ラムは全て動作しましたので、多分入力ミスはないかと思います。


起動画面とオブジェクトリスト


例にあったクイックソートプログラム


LISPを触るのは数十年ぶりで、何も覚えていないので、黒川先生の「LISP入門」を
本棚から引っ張り出して第一歩から勉強かな。

[4月27日追加] 入力リストのミスを1つ見つけましたが、アセンブル結果には影響
がありませんでした。もうミスはないと思いますのでチェックを終えます。

FLEX9上で動くものですが、ソースがあれば移植も可能かと思いますので、ソースと
アセンブルリストをOneDriveに上げておきます。
(雑誌で公開されていたものですので、個人使用のための公開はOKではないかなと
思っていますが、どうでしょうか。ちなみに芹沢先生は論文でも発表されているよう
です。)

SBC8080にGAME80をインプリメントの試み

SBC8080にGAME80をインプリメントしようとしたのですが...


まず、せっかくSBC8080を製作したので、ソフトを作ってみようとしたのですが、PALO ALTO TINY BASICはメモリをアクセスできないようです(本当か?)。
68系の電大版BASICやGAME68ではできるので、できて当たり前だと思っていましたが、なぜでしょうか。
ならばモニタでと思いましたが、このモニタのアセンブラや逆アセンブル機能はとても便利ですが、メモリ中のバイナリを表示・変更する機能がないようです(私が使い方を知らないだけ?)。

80系のプログラムの経験はほとんどないので、モニタを自作するなんてとても無理ですので、言語を入れるしかないということで、候補に挙げたのがGAME80とMicroPascalです。

まずGAME80ですが、高岡洋一さんによってTK-80BS用に作成されたもので、ASCII誌の1979年1月号に掲載されました。(私はENCYCLOPEDIA ASCII 第3巻に載っていたものを入力しました。)
プログラムは$8600~$8C88で、その後ろにSBC8080用のI/OルーチンをくっつけてROMの$7800からに、そして転送プログラムを$7F00からに焼いて実行してみましたが、正常に動作しません。(I/Oルーチン等は下に記述しておきました。)

正常に動作しない実行画面

画面のように、:が表示された後に入力を受け付けるのですが、入力後は改行されずに行頭に戻るだけです。さらに入力は受け付けるのですが、重ね書きになるだけです。
モニタに戻って、$8E00からを見てみると先頭の$8E00が$FFのままで、入力したプログラムは保存されていません。

GAME80本体のリストは2度確認しましたし、とても見やすい印刷ですので入力ミスはないと思うのですが。。。8080のプログラム経験がないので、自信はないのですが、I/OルーチンのうちINCHとOUTCHについては動作確認をしたつもりです。

というわけで、どこが間違っているのか分からず、中断状態です。
ネットには、SBC8080でGAME80を動作させておられる方が見えますので、できるはずだとは思いますが、私の手に余っています。アドバイスいただけるとありがたいです。
下に、追加変更箇所を記しておきます。

追加変更した箇所


◎入出力ルーチン
元のプログラムはTK-80BS用なので以下の3つのルーチンを書き換える。
GETCH $8C96 入力→A
PUTCH $8C99 A→出力
SENSE $8C9C キーが押されていたらキャリーセット、
押されていなければクリア
解説に従って、
BREAKルーチン($8797,$87A1)を CALL $8C96(CALL GETCH)に変更
(文中では$87A1とあるがリストでは$87A2だった)

◎ワークエリア等(とりあえず変更なし)
内容 アドレス データ
プログラム先頭番地 8607 8E00
RAM終了アドレス          8612 9FFF
RUBOUTコード 8C72 08
DELETEコード 8C4F 7F
CRコード 8C77 0A
JOB一時停止コード 87A0 20
JOB打ち切りコード 879B 21
第1スタック                  8618 8E00
                                        875F   
第2スタック                  861B 8DC4

◎メモリマップ(とりあえず変更なし)
8600 - 8C98 GAME80インタプリタ
8C99 - 8CFF I/O その他ルーチン
8D00 -    87 変数 その他
    88 -    89 第2スタックポインタ
    8A -    D3 入力バッファ
      第2スタック
    D4 -    FE 第1スタック
8E00 - プログラム格納域

************************************************
追加箇所
(1)SENSE 8C9C F3 DI
      9D DB 01 IN 01
      9F E6 02 ANI 02
      A1 CA A8 8C JZ 8CA8
      A4 37 STC
      A5 C3 AA 8C JMP 8CAA
      A8 37 STC
      A9 3F CMC
      AA FB EI
      AB C9 RET

(2)INCH   8CAC F3 DI
      AD DB 01 IN 01H
      AF E6 02 ANI 02H
      B1 CA AD 8C JZ 8CAD
      B4 DB 00 IN 00H
      B6 FB EI
      B7 C9 RET

(3)OUTCH 8CB8 F5 PUSH PSW
      B9 DB 01 IN 01H
      BB E6 01 ANI 01H
      BD CA B9 8C JZ 8CB9
      C0 F1 POP PSW
      C1 D3 00 OUT 00H
      C3 C9 RET

変更箇所
(1)8C96 CD AC 8C     CALL  INCH
(2)8C99 C3 B8 8C     JMP    OUTCH
(3)8C9C SENSE
(4)8797 CD 96 8C
   87A2 CD 96 8C

************************************************
以上のルーチンをROMの$7800~$7EFFに保存し、
起動プログラムで$8600からに転送し、起動する。

起動プログラムはROMの$7F00からに置く
             7F00 21 00 78         LXI H,7800H
  03 11 00 86         LXI D,8600H
  06 01 00 F9         LXI B,F900H
  09 7E MOV A,M
  0A 12 STAX D
  0B 23 INX H
  0C 13 INX D
  0D 0C INR C
  0E C2 09 7F         JNZ 7F09
  11 04 INR B
  12 C2 09 7F         JNZ 7F09
  15 C3 00 86         JMP 8600
以上

動作させるまでの道は遠いみたいです。
MicroPascalはソースが公開されているのでこちらをインプリメントした方が速いかなあ。(6802基板でMicroPascal68が動いているので、共通のプログラムが書けて良いかも。)


2019年4月12日金曜日

番外編(その2)i8080Aなどをいただいたので...

とあるところからi8080Aや周辺ICをいただきました



いただいたIC群

80系のセラミックIC

68系のセラミックIC

いただいたICは
80系:INTEL i8080A(2個)、NEC D8080A、iP8031(3個)、ZILOG Z80A
   MOSTEK MK3880N(3個)、RCA CDP1802AE
   iP8228(3個)、iP8212(3個)、iP8224(2個)、uPB8224(2個)など
68系:HITACHI HD6801、FUJITSU MBL6803(4個)
   Motorola MC6830L7、MC6830P8、MC6850L、MC6810AL

CPUだけでなく、周辺ICもセラミック製がいくつもありました。
セラミックICを使ったことはほとんどなかったので、これは作ってみるしかないということで、早速SBC8080基板を入手して製作しました。
(68系にしか手を出さないことにしているのに、、、またやってしまった。。。)

製作したSBC8080 CPU+SUBボード

セラミックICが目立ってる!

サンプルを走らせてみた


1976年製のCPUなので40年以上も前のICですが、ちゃんと動くということに結構感激。
これで何をするという計画もないので、とりあえず製作しただけで自己満足状態ですが、できればBASIC以外の言語を走らせてみたいなと。

68系のICは何かそれらしい活用法を考えようと思っていますが、他にもやってみたいことがあるのでいつになりますやら。(大昔、とても欲しかったMIKBUGが入っているMC6830Lですが、今となってはただの飾りになりそう。)

2019年3月11日月曜日

6809用、6802用モニタプログラムの改良

6809用、6802用モニタプログラムを改良しました


ROMにはASSIST09やMIKBUG2も入れてありますが、私の場合はそれらよりも自作のモニタを使うことの方が多いようです。入出力がターミナル仕様だから使いにくいからというわけではなく、ASSIST09をフルキーボードとVideo-RAMで使用したりもしていましたが、やはり、自分で作ったものの方が愛着もあり、使いやすいということなのでしょうか。

ということで、6809でも6802でも自作のものをメインに使っていましたが、今まで使用していたモニタは、30年以上前に6802システムで自作フルキーボードと自作Video-RAMを使用していた時代のものをシリアル入出力に変更してちょっと手直ししただけのものでしたので、ワークエリアにも無駄が多いですし、機能面でも不足しています。

ということで、思い切ってここでモニタを改良することとしました。

改良の目標とした点


(1)6809と6802とでの操作性を統一する
・デュアルボードでは頻繁に6809と6802とを切り替えて使用するので、操作性が異なると非常に使いにくいので。

(2)使い勝手を良くする
・1文字のコマンドを入力してからパラメータを入力するのではなく、一度にまとめて入力できるようにする。(対話形式は、慣れるとうっとうしいだけ。)
・パラメータの入力時、何桁の数値を入れても最後の4桁(アドレス値の場合)、2桁(データ値の場合)のみを有効値として取り込む。(ASSIST09と同様の機能で結構便利。)

(3)機能を追加する
・BreakPointを設定可能にする。ASSIST09のように8個もいらないとは思いますが、1個ぐらいあった方が、やっぱり便利なようですので。ただし、SWIのコードに置き換えますのでRAM領域にしか設定できません。
・Dumpコマンドに16バイト毎のチェックサムを追加する。これに伴い、指定アドレスが切りの良い値でない場合でも、その通りの範囲で表示されるようにする。(実はこれが最も時間がかかった部分です。CS表示のためには必要でした。)

ASSIT09の場合

6809MONの場合

1行表示の場合も正常です

苦労した点


今までのモニタは、6802用に作成したものを6809に移植したものでしたが、今回はまず6809で作成し、それを6802用に書き換えるという順序で作成しました。
単なる命令の置き換えで困ることはそうありませんでしたが、同等命令のフラグの違いには結構苦労させられました。特に、6800のCPXと6809のCMPXのフラグの違いには悩まされました。
また、6809や6802のシングルボードでは異常がないのに、6809/6802デュアルボードでは6800FLEXの起動にのみ失敗することがありました。いったん起動してしまえば、その後は正常に動作し続けるので、ハードには問題がなく、モニタに実装しているFLEX起動コマンドを疑い、あれこれ手直しをしてみましたが、結局、ソフトではなくハードの問題だという結論に達して、現在は09/02切替部分について検討中です。(これに2か月以上かかりました。)

改訂版モニタVer6.1が出来上がりました


ということで、モニタは改訂版ということでVer6とし、半月ほど使用しながら手直しをしてVer6.1が出来上がりました。

使用するROMの容量とモニタの配置

ROMとしては27128の16KBで良いのですが、27256や27512を使用する場合は上記のように配置します。これで、自作モニタとASSIST09やMIKBUG2とを切り替えられます。

モニタとしてはこの程度の機能があれば良いのかなと思います。もうこれ以上機能拡張をする予定はありませんので、OneDriveにソースと共に上げておきます。

また、FLEXを動作させる際の仮想ドライブシステムであるFlexDrvWin.exeも手直しをしました。ReadコマンドとWriteコマンドの受信方法に改良を加えたのと、各自の環境に合わせるために、同じディレクトリに置いたiniファイルを起動時に読んで、その値(ポート番号、ボーレート、ハンドシェーク、ウィンドウ位置)を設定できるようにしました。
私の環境用のiniファイルFlexDrvWin.iniと共にOneDriveに上げておきます。なお、これはVisualStudio2013Communityでビルドしましたので、そのランタイムが必要かもしれません。

2019年2月23日土曜日

番外編 ー 68Katy-aeの制作

6821PIAを用いたI2C通信ができて以来、ブログの更新をしばらくできませんでしたが、その間何をしていたかと言いますと、懸案だった6809と6802基板用のモニタープログラムの修正をしていました。(次回のブログで紹介します。)
せいぜい2週間ぐらいの予定で始めたのですが、変なところでつまずいてしまい、四苦八苦している間に、気分転換も兼ねて68Katy-aeに手を出してしまいました。

基本的に6809と6800(6802)にしか関心はないのですが、なぜか手元にHD6301などがあったこともあり、先日は電脳伝説さんのSBC6303も作ってしまいました。
[蛇足]製作した電脳伝説さんのSBC6303基板では、手持ちのHD6301V1P, HD6303RP, HD637B01VOPのいずれも正常に動作しました。

SBC6303とBL基板


昔、SHARPのX68000でOS-9/68000を使っていたこともあり、いつかは68K基板を設計したいと思ってはいましたが、知識も技術も時間もなく手が出せませんでした。
ということで、68Katy-ae基板です。手持ちのCPUは68000ばかりで68008はないので、ちょっと残念でしたが、68Katyの原作者とae版の作者tomi9jpさんが知恵を絞ってくれたおかげで、私は何も考えずに手を動かせば良いのだと安直に考えたのが間違いでした。

結局、基板、XC9532、68008に加えてAE-FT245RLまで買い直す羽目になり、まだ完成したわけではありませんが、ネットではうまく動作したという記事がほとんどなので、失敗したという記録もそれなりに意味があるかもと思いますので、ここに残しておくことにします。

製作した基板3枚 上は不良だったAE-FT245RL


その1 XC9532の取り付け間違い。CPLDはAlteraしか扱ったことがなく、Xilinxは初めてということもあり、チップの〇印を見てもピン1の位置が良く分からず間違えてしまいました。
(印字を基準にして左上がピン1が普通だろー--泣。)ーー>画像右端の基板

その2 XC9532の書き込みに苦労。Alteraの書き込みケーブルは何種類か持っているのですが、Xilinxのダウンロードケーブルはありませんでしたので、まず中古のパラレルケーブルを入手しましたが、これが不良品で、どうやってもIMPACTで認識しません。次にUSBのダウンロードケーブルDLC9を入手しましたが、何とこれも不良品でした。最後にUSBIIのDLC10を入手し(高かった!)、ようやく書き込みができました。
その間、tomi9jpさんにXC9532について質問した際のやり取りの結果、AE-FT245RLで書き込みをする手順を公開していただけたのですが、この方法でもうまく書き込めませんでした。何十回か試みると1回ぐらい書けたような反応をすることもあったのですが。。。
 ->実は、この原因はAE-FT245RLにあったことが後に分かります。


入手したダウンロードケーブル



その3 ROM1のMX29F040TCを最初から取り付けてしまった。後からでは取り付けが困難だからと思ったのですが、結果的には動作しない場合の原因の切り分けが難しくなってしまいました。CPLDには正常に書き込みができているのに、TeraTermには全く何も表示されない。。。
このために、SRAMやROM0を交換したり、68008やAE-FT245RLを買い直したりしましたが、症状は変わりません。-ー>画像中央の基板。まだ動作していません。。。
[訂正]動作しました。最下行に経過を追加しました。

その4 3枚目の基板でようやく動作。ROM1を取り付けず、CPLDへの書き込みデータをオリジナルのものにしたら動作しました。最初は画像のように、訳のわからない表示だったのですが、FT245RLを交換したら正常になり、uLinuxも動作しました。ーー>画像左端の基板

不良FT245RLによる表示(リセット直後の?入力)

正常FT245RLによる表示(リセット直後の?入力)

uLinuxも動作した

その5 AE-FT245RLの不良。あれこれ調べた結果、何とDB4ピンのハンダ付け不良であることが判明し、ハンダ付けし直して無事復活しました。秋月さんには数十年来お世話になっていますが、こんなことは初めてでした。今までは使えていたので、ソケットの抜き差しを繰り返しているうちにハンダ付け部分が緩んだのですね。

FT245RLのハンダ付け不良個所(DB4ピン)



現在はROM1を取り付けていませんが、増設するかどうか迷っています。それよりも動作していない中央の基板の原因追及を優先すべきだと思いますので。

以上、68Katy-aeを何とか動作させるまでの四苦八苦の記録でした。

[追加]画像中央の2枚目の基板(TSOPを追加してあるもの)が動作しました。
オシロで見てもクロックは正常ですし、アドレスバスやデータバスを見ても異常は見つけられなかったので、回路図を見ながらすべての配線をチェックしたところ、2ヶ所導通がないことを見つけました。いずれもCPLDの端子のところで、見た目は正常にハンダ付けされているように見えました。(ハンダ付け歴50年以上なのに恥ずかしい。。。)
この結果、zBugやuLinuxはもちろん、ROM0のAMD29F040の内容をTSOPのMX29F040にコピーして、ROM1からも起動できました。tomi9jpさんに感謝感謝です。

この基板で68Kの機械語を覚えて、使いこなせるようになるといいなあ。(機械語が一番面白い。次はC言語、そしてJAVAかな。)

2018年11月17日土曜日

I2C通信でLCD表示器に文字表示ができましたが...

LCD表示器に文字表示ができましたが、標準の書き方ではなく...


使用したのはスイッチサイエンスで購入した8文字2行表示のAQM0802A(5V版)です。
5V版なので、10月27日に公開したRTCの回路にそのまま追加しました。

接続図


コマンド・データの書き込み手順


コントロールICはST7032iで、そのマニュアルによると、コマンドやデータはいずれもコントロールバイトとデータバイトの2バイトのセットで書き込むようになっています。

コマンドの場合 複数連続して書き込む場合 :$80+1byte(コマンドコード)
        単独又は最後に書き込む場合:$00+1byte(コマンドコード)
データの場合 複数連続して書き込む場合 :$C0+1byte(データコード)
       単独又は最後に書き込む場合:$40+1byte(データコード)

$00+1byteや$40+1byteの後には必ずI2Cのストップコンディションが続いて終了することになっています。


連続書き込みでは$80や$C0を毎回書くのですが...


実際にプログラムを作って試してみると、
S+ADR+($80+CmdCode)+($80+CmdCode)+...+($00+CmdCode)+P

S+ADR+($C0+Data)+($C0+Data)+($C0+Data)+...+($40+Data)+P
 (S:スタートコンディション、ADR:スレーブアドレス、P:ストップコンディション)
という書式で確かに書き込みができました。

しかし、ネット検索をしてみますと、$80や$C0を用いて連続書き込みをするのではなく、$00や$40を用いて1byteずつ書き込む例も結構見られます。例えばArduinoのC言語であれば、Wireライブラリを用いて、

コマンド書き込みの場合は
Wire.beginTransmission()とWire.endTransmission()で挟んで
Wire.write()で$00と1byteのコマンドを書く。

データ書き込みの場合は
Wire.beginTransmission()とWire.endTransmission()で挟んで
Wire.write()で$40と1byteのデータを書く。

というような形式です。(この例のbeginTransmission()とendTransmission()はそれぞれS+ADRとPだと思われます。)


もう少し効率的に連続書き込みをする方法がありました


確かに、1文字の書き込みなら$00や$40を用いるのがマニュアル通りの書き方なので良いのですが、複数バイトのコマンドやデータを書き込みたい場合には、スタートコンディション、スレーブアドレス、ストップコンディションを1byte毎に書くことになり、いかにも非効率です。
かといって、連続書き込み用の$80や$C0を1byte毎に書くのもあまり効率が良いとは言えません。スタートコンディション、スレーブアドレス、ストップコンディションは1回で済むという利点はありますが。(これしか方法がないのなら仕方がないのですが)

他の書き込み方はないのかと色々と試行錯誤した結果、下記のような書式で書き込めることを確認しました。

コマンド書き込みの場合
S+ADR+$00+(複数のコマンドコードを順に)+P

データ書き込みの場合
S+ADR+$40+(複数のデータを順に)+P


この書き方は、明らかにマニュアルで説明されている書式とは異なっているのですが、画像のようにちゃんと書き込めています。

AQM0802A表示例


最後に

なぜST7032iのマニュアルに載っていない書式で連続書き込みができるのかは分かりませんし、マニュアルを熟読すればどこかに記載されているのかもしれませんが、あくまでもAQM0802Aの一使用例として見ていただければと思います。
何か勘違いや間違い等ありましたらご指摘いただけるとありがたいです。

6809のアセンブラでLCDWR.TXT,LCDWR1.TXT,LCDWR2.TXTの3つのプログラムを作成し、いずれも正常に書き込みできることを確認しました。

LCDWR.TXTの書式(最も短い)
  command : S+ADR+$00+cmd1+cmd2+...+lastcmd+P
  data         : S+ADR+$40+dat1+dat2+...+lastdat+P
LCDWR1.TXTの書式(初期化コマンドのみ短い)
  command : S+ADR+$00+cmd1+cmd2+...+lastcmd+P
  data         : S+ADR+($C0+dat1)+($C0+dat2)+...+($40+lastdat)+P
LCDWR2.TXTの書式(標準の書式)
  command : S+ADR+($80+cmd1)+($80+cmd2)+...+($00+lastcmd)+P
  data         : S+ADR+($C0+dat1)+($C0+dat2)+...+($40+lastdat)+P

参考になるかどうかわかりませんが、作成した3つのプログラムのソースをMicrosoftのOneDriveに上げておきます。


2018年11月3日土曜日

PIAのみでRTCからの時刻の読み書きができました

PIAに接続したRTCから時刻を読み書きするアセンブラのプログラムが完成


前回(10月27日)はRTCモジュールから時刻を読み込むまででしたが、時刻の書き込みもできるようになりました。
読み込み・書き込みプログラムはそれぞれRTC_RD.CMD、RTC_WR.CMDですが、読み込みプログラムに、FLEX9の起動時に時刻をRTCモジュールから読み込んでFLEX9の日付を設定する機能を追加したSETDATE.CMDを用意しました。

RTC_RD.CMDとRTC_WR.CMDはFLEX9上のコマンドとして使用します。


FLEX9システムに組み込んで使用する


SETDATE.CMDはFLEX9の起動時に自動的に実行されるように、STARTUP.TXTに書き込んでおいて使用しますが、FLEX9の起動時にデフォルトで実行される日付入力ルーチンが不要になりますので、FLEX9のシステムを一箇所変更します。

FLEX9システムをTrk01,Sct01から保存した場合、初期化ルーチンはSct08にあります。
そのうちの日付入力ルーチンはオフセット$76からのBD,CA,AC (JSR $CAAC) ですので、このBDを39 (RTS)に変更します。

初期化ルーチン(変更前)
初期化ルーチン(変更後)

これによって、起動時に日付を問い合わせてくることは無くなり、代わりに、STARTUP.TXTに書き込んだSETDATE.CMDがRTCモジュールから取得した日付を設定してくれることになります。

その様子を下図に示します。


起動画面(従来のもの)

今までは、起動時に日付を「月、日、年」の順に入力する必要がありました。
(FLEX9では時刻は管理していませんので、年月日のみです。)
それに対して、SETDATE.CMDを組み込むと、

起動画面(RTCモジュールから読み込み)

日付を問い合わせてくることなく、RTCモジュールから取得した日付と時刻を表示してそのままコマンド入力待ちになります。DATEコマンドを入力してみると、確かに日付が設定されていることが分かります。
なお、RTCモジュールが無い場合には、デフォルトの日付入力ルーチンが呼び出されて手動で日付を入力することになります。

起動画面(RTCモジュールが無い場合)

作成したRTC_RD.CMD, RTC_WR.CMD, SETDATE.CMDのソースをOneDriveに上げておきます。
入出力ルーチンなど一部にFLEX9のシステムルーチンを使用していますが、I2C通信部分は一般的な6809のアセンブラですので、I2C機能を持たないマイコンで、しかもアセンブラでI2C通信をしたいという場合の参考になれば嬉しいです。
(I2Cの解説も、DS3231のマニュアルも、もう少し分かりやすく書いてもらえればこんなに苦労しなくても済んだかもしれないのに...愚痴でした。)

2018年10月27日土曜日

アセンブラでのPIAとRTCの間のI2C通信に成功しました

アセンブラでPIAを経由してRTCの時刻の読み出しができました


使用したRTCモジュールはアマゾンで入手したHiLetgoのZS-042です。このモジュールにはDS3231というチップが使われており、I2C通信で時刻の設定や読み出しを行うようになっています。
I2C通信については、名前を知っているだけで具体的なことは全く知らなかったのですが、FLEXの起動時の日付の入力が煩わしいので、RTCからの自動読み込みに挑戦することにしました。

しかし、ネット上の情報は多くがArduinoとの接続の場合で、しかもWireライブラリを使うものがほとんどで、私もRTCモジュールが動作するかどうかをArduinoで確認しましたが、30分もあればできるという簡便さは誠にありがたいのですが(ライブラリを作成してくれた方には感謝です...)、6809のアセンブラでI2C通信プログラムを書きたい場合には全く役に立ちません。

また、PICやAVRなどのマイコンのアセンブラでI2C通信をしているものも幾つか見つけましたが、これらもマイコン自身にI2C通信機能を備えたものを使用している場合がほとんどで、これも役には立ちません。また、I2C通信機能を持たないPICやAVRでのケースもありましたが、これらのマイコンはポートのビット処理命令を持っているので、ビット処理命令を持たない6809ではプログラムの参考にはあまりなりませんでした。

ということで、結局、I2C通信の解説とDS3231のデータシートを読みながら、自力でプログラムを組むことになりました。

6821とRTC間の接続

6821とRTC間は下図のように配線しました。
図中のプルアップ抵抗はPortAの内蔵抵抗で代用しています。
6821のPortAはオープンドレインで、しかも5kΩの抵抗でプルアップされていますので、I2C通信に適しているということと、入出力の切り替えが不要で、出力に設定したままで入力も可能(但し、予めHを出力しておく必要あり)なので、プログラムが書きやすいと考えました。

RTC配線図


ロジアナを所有していないので、デジタルオシロで波形を見ながら試行錯誤を続けましたが、手順の最初のスレーブアドレスの書き込みからして成功しているのかどうかも分からず、全くACKが返ってこない状態が続き、間にPICでも挟まないとダメかとあきらめかけたこともありました。

最終的には、SDA信号は、Lowは0を出力するのに対して、Highは1を出力するのではなく開放、つまりHi-Zにするのだということに気づき、それに対応するように書き直すことで、ようやく読み込みができるようになりました。

読み出しに成功

下図で表示されたデータは、RTCの最初の7レジスタを読んだもので、順に、秒、分、時、曜日、日、月、年を表しています。

RTCから日付と時刻を読み取り

現段階では、ようやく読み取りができたというところまでですが、あとは書き込みルーチンを作成し、それを常駐プログラムの形式にして、FLEXの初期化ルーチン中の日付入力ルーチンと置き換えれば完成です。
(完成しましたらプログラムは公開します。)

[11月4日 追加] 完成したプログラムは11月3日のブログで公開しています。

2018年10月15日月曜日

6809/6802両用基板が完成しました

6809/6802両用基板を修正しました


最初に製作した6809/6802両用基板は、9月15日の投稿で述べたように、修正箇所があったこととPIA(6821)を載せたかったので修正基板を製作しました。

これは最初に製作した基板ですが、

6809 / 6802 両用基板の第1作


このようにPIA(6821)を外付けすると修正基板と同機能となります。


6821を追加しました


ブレッドボード風に使用できるようにピンを立ててみました。

6821基板


これが修正基板です。

修正基板(6821を追加しました)



回路図を掲載します。
6809と6802の切り替え部を簡略化し、それに応じて不要になった74HC08を除き、空いたスペースを利用して68B21を追加しました。



修正基板の回路図


これで当初の目標であった、シングルボードコンピュータで6809用、6800用のFLEXを動作させることができるようになりました。

===== 一応の完成! =====

あと残っている課題ですが、FM77AV40SX上のFLEXを使っていた時には、起動時に、内蔵されているリアルタイムクロックから現在時刻を取得して起動時の日付の入力を自動化していましたので、同様なことができないだろうかと考え、arduinoなどで使われているRTC基板ZS-042と6821との間でI2C通信を試みているのですが、今のところうまくいっていません。
(2MHzのMPUではI2Cの推奨の最低値である100KHzはとても無理で50KHz程度の速度しか出ないようなのですが、これが原因ではないとは思いますが。。。)


RTCとの通信実験中


これができたら、基板の製作は一応打ち止めにして、あとはFLEX上のソフトを活用して、プログラムの制作に本腰を入れようかと思います。

実現したいものとしては、まずはツール類の充実と、あとは願望ですが、
 MC09の改造、6809用コンパイラの自作、OS-9Level1の移植
などがあるのですが、いずれも難度が高いものばかりですので、どうなりますやら。。。

(いずれにしても趣味の世界ですので、無駄な「タイヤの再発明」をモットーとしており、ツール類を始めとしてアセンブラや逆アセンブラ等もすべて自作したものを使用することにしていますので、言語類も自作したいのです。。。究極はOSの自作でしょうか。)

OS-9の移植ですが、手元にFM-7用Level1、FM77AV40用Level2のライセンスがあり、Level1の方は今は使用していないので、これを使えればと考えています。
(以前、FM77AV40上でOS-9用のROM,RAMディスクとWindows上の仮想ドライブを製作した経験がありますので、それを生かせれば何とかなるかなあ。。。)