ASSIT09で、8-Queens ― 2023年12月21日 17:18
8-Queensを解くプログラムです。これは、8x8のマスにお互いが鑑賞しないようにQueenのコマの配置を求めるプログラムです。オリジナルで作成しようと頑張ったのですが、行き詰まってしまいました。いつものように、先人の方々のお知恵を拝借しました。調べてみると、ヴィルトの「アルゴリズム+データ構造=プログラム」にPascalで書かれたスマートな解がありました。暑中参照している「マイクロコンピュータのプログラミング」にもMicroPlanでの解が掲載されています。このMicroPlanの解を参照して、プログラムを作成しました。
さて、下敷きにしたプログラムは、Queenの配置を求めるルーチンが再帰的に書かれています。これをMC6809のアセンブラで書き下すのがキーポイントでしょう。想像しているより簡単に実現できました。MC6809にはスタックが、システムスタック Sとユーザースタック Uの2つがあります。このユーザースタックに、再帰的関数内部のローカル変数を退避させることでうまく行きました。 プログラム、アセンブルリスト、実行結果などは、こちらです。 8Queen.zip
いつものように、Lコマンドでロード・モジュールをダウンロードし、Cコマンドで、C000から実行させます。
Queenの配置が、次々と出てきます。
=== 8 Queens === 0 4 7 5 2 6 1 3 0 5 7 2 6 3 1 4 0 6 3 5 7 1 4 2 0 6 4 7 1 3 5 2 1 3 5 7 2 0 6 4 1 4 6 0 2 7 5 3 1 4 6 3 0 7 5 2 : : :例えば、"0 4 7 5 2 6 1 3"は、
カラム 0のQueenは、ロウ 0に カラム 1のQueenは、ロウ 4に カラム 2のQueenは、ロウ 7に カラム 3のQueenは、ロウ 5に カラム 4のQueenは、ロウ 2に カラム 5のQueenは、ロウ 6に カラム 6のQueenは、ロウ 1に カラム 7のQueenは、ロウ 3ににあることを示しています。こんな配置です。
0 1 2 3 4 5 6 7 0 Q . . . . . . . 1 . . . . . . Q . 2 . . . . Q . . . 3 . . . . . . . Q 4 . Q . . . . . . 5 . . . Q . . . . 6 . . . . . Q . . 7 . . Q . . . . .
ASSIT09で、マイクロトレック ― 2023年11月07日 20:48
Assist09で動くアプリケーションを考えていたところ、石田晴久編「マイクロコンピュータのプログラミング」に 掲載されている、「宇宙戦争ケームのプログラム」が目に止まりました。いわゆる、スタートレックものです。石田先生作の Tiny-BASICで書かれた100行程度のプログラムリストが掲載されています。これを人間コンパイラになって、 6809アセンブラに変換しました。もとのリストには幾つか不具合がありましたが、解決しました。 結果、約700行のプログラムができました。 ここから、アセンブラ・ソース、アセンブル・リスト、ロード・モジュールを含むZIPファイルをダウンロードできます。 mtrek.zip
Assist09で実行するには、Lコマンドでロード・モジュールをダウンロードし、Cコマンドで、C000から実行させます。
こんな感じです。
"CAPTAIN :"に続いて、コマンドを入力します。
コマンドは、1:ミサイル発射、2:セクター移動、3:新しいギャラクシーにワープ、です。ミサイルでクリンゴンをすべて
やっつければ"WIN"、時間切れやエネルー切れで、"LOOSE"です。
このプログラムは、ポジションインディペントなプログラムです。Lコマンドにオフセットをつけてロードしても、
問題なく動作します。
ASSIST09で、Hello World! ― 2023年10月29日 08:15
モトローラのMC6809を使った自作マイコン"MyOwn6809"は、Assist09というモトローラが発表した モニタープログラムを搭載しています。Assist09には、12のサービスルーチンがあります。
- INCHP 文字入力
- OUTCH 文字出力
- PDATA1 文字列送出
- PDATA 改行と文字列送出
- OUT2HS 1バイトの16進化
- OUT4HS 1ワードの16進化
- PCRLF 改行
- SPACE スペース送出
- MONITOR Assist09の起動
- VCTRSW ベクタ・スワップ
- BRKPT ユーザ・ブレイク・ポイント
- PAUSE プログラム・ブレークとチェック
これらのサービスを使うことで、プログラムの開発をスムーズに進めることができます。
いつもの Hello World!を作ってみました。
* HELLO.ASM -- SAY "HELLO WORLD!" * ASSIST09 SERVICE ENTRY CODE PDATA EQU 3 PUT CR/LF AND STRING TO CONSOLE * CONSTANT VALUES EOT EQU $04 END OF TEXT CR EQU $0D CARIGE RETURN LF EQU $0A LINE FEED RAMTOP EQU $C000 * ORG RAMTOP MAIN: LEAX HELLO,PCR SWI FCB PDATA RTS * HELLO: FCC 'HELLO WORLD!' FCB CR,LF,EOT * END
このプログラムは、RAMエリアの先頭、C000からロードするように作ってあります。このようにして、実行します。
このプログラムには、プログラムをどのような位置にロードしても実行できるように、おまじないをかけています。
論より証拠、C000からロードして、更にC020からにロードして実行してみました。
C020から実行しても正常に動いています。 いわゆる「リロケータブル」なプログラムになっています。変数のアドレスを指定するのに、プログラムカウンタの値を基準にして 指定しているので、このようなことができます。プログラムカウンタ相対です。
このプログラム中、出力文字列のアドレスを指定する部分、
LEAX HELLO,PCRで、"PCR"がプログラムカウンタ相対を指定しています。
System02 / MyOwn 6809 〜〜 回路図を公開します ― 2022年10月20日 20:30
前回、前々回にお披露目した System02 と MyOwn 6809 の回路図を公開します。
まずは、 System02 です。(クリックすると拡大します。)
スペックは、CPUに MC68B02、RAMは 2KB、I/Oには MC68B21を配置しました。
クロックは、1MHzの水晶を使ったため250KHzです。
モニタROMはありません。どうやって使うかというと、DMAをつかって直接RAMにプログラムを書き込みます。
とても原始的な使い方ですが、スイッチをパチパチやっていると、コンピューターを 思うように操っている気になってくるから、不思議です。 プログラムが、きちんと動いたときの充実感は、また、別格です。
お次は、MyOwn 6809 です。(クリックすると拡大します。)
スペックは、CPUに MC68B09、RAM 8KBとROM 4KB、PTM MC68B40、ACIA MC68B50、ACIAのクロックジェネレーターに MC14111を 使ってます。
クロック用は、2MHzの水晶を使ったので 500KHz です。
PTMを搭載したので、ASSIST09モニターのトレースコマンドが使えます。念願を達成しました。
MyOwn 6809 〜〜 長年の夢がかないました 〜〜 ― 2022年10月09日 15:02
やっと夢が、かないました。ASSIST09がフルペックで動くボード完成しました。MyOwn6809です。構想をたて設計/製作と 中断をはさみ、足掛け3年ぐらいかかりました。実質、一年というところでしょうか。
MyOwn6809は、MC68B09を中心に、ACIA 68B50、PTM 68B40と、RAM 8KB、ROM 2KBを配しました。 ボーレイトジェネレータに、贅沢にMC14111を アドレスデコードは手抜きをするために、GAL 20V8を使ってます。 MPUの状況をモニタする回路も仕込みました。 誰が考えても同じようになるH/W構成です。ちなみに、配線は全て手半田です。
ASSIST09は、ネットで見つけたソースリストを使っています。完成品と思っていたのですが、 MyOwn6809が完成にこぎつけるまで、このソースリストが最後まで足を引っ張りました。PTMの設定に問題がありました。 ソースリスを二ヶ所修正しました。まず、PTMの初期設定の部分で、
CLR PTMTM1-PTM,X CLR PTMTM1+1-PTM,X LDD #$FFFF STA PTMC2-PTM,X STA PTMC13-PTM,Xを
CLR PTMTM1-PTM,X CLR PTMTM1+1-PTM,X LDD #$01A6 STA PTMC2-PTM,X STA PTMC13-PTM,Xに、変更。トレースコマンドにあるPTMの動作を設定ところを
STU <LASTOP LDU <VECTAB+.PTM LDD #$0000 STD PTMM1-PTM,Uを
STU <LASTOP LDU <VECTAB+.PTM LDD #$0701 STD PTMM1-PTM,Uに変更し、ビルドしました。これで、トレースコマンドを含む全コマンドが使用可能になりました。
多くの製作例を参照して製作に当たりましたが、最後まで自分を信じることで完成にたどり着けたと考えています。 はぁ〜、長かった。
次は、68000とCP/M 68kに挑戦です。
MC6802を使ったSystem02の製作 ― 2022年09月03日 16:57
モトローラのMC6802は、MC6800にクロックジェネレーターと256バイトのRAMを追加した CPUです。これを使った小さなシステムが別冊I/Oに掲載されていました。手持ちの部品を 活用するため、一部変更し製作したのが、System02です。
構成は、MC6802を中心に、パラレルインターフェースのMC6821とRAM 2KBを配置しました。
動作クロックは、1MHzの水晶を使ったので、250KHzです。コンソールは、アドレススイッチと
アドレス表示用のLEDを12ビット分と、データスイッチとデータ表示用LEDが8ビット分。それに、
DMAのスイッチ、データ書き込みスイッチ、リセットスイッチがあるだけです。
プログラムの書き込みは、DMAスイッチを入れて、アドレススイッチで書き込みアドレスを 設定し、データスイッチで書き込みデータをセットし、書き込みスイッチをプッシュします。 そうすると、データLEDが書き込んだデータを表示します。
一通り書き込んだ後、DMAスイッチを切り、リセットスイッチをプッシュし、プログラムを 起動します。
処理結果は、DMAスイッチをいれ、結果が入ったメモリーアドレスを アドレススイッチで 設定しデータLEDの表示を読み取ります。
とても原始的な使い方しかできませんが、結構遊べます。
SBC6809でASSIT09 -- 挫折編 ― 2021年04月07日 13:34
寄り道をしていたため、ブログを疎かにしてしまいました。申しわけございません。
さて、Vintage ChipさんのSCB6809でASSIST09をフルスペックで動かすために、 PIC12F1822にPTMの代わりをさせようと検討し実験をしてきましたが、できませんでした。
PIC12F1822のTMR0でEクロックを数えて、タイミングよくNMI信号を出そうとしたのですが。 カウントする様子をロジックアナライザーで観測したところ、多くカウントしてしまいます。 どうも、Eクロックの計数がうまく出来ない様子です。PIC12F1822のマニュアルを見てみると、 TMR0はCPUクロックの4分の1に同期してサンプリングすると書いてあります。CPUクロックは32MHz、 Eクロックは500KHzですので、Eクロック一つを二つ以上にカウントしてしますことが起こるようです。
プログラムのコーディングを変えて実験しましたが、方針が良くないのでうまくいくはずがありません。 残念ですが、あきらめました。実のところ、あきらめきれずにズルズルと実験を繰り返していました。 ここら辺で潮時としました。
寄り道の内容は、後日、お話しします。
SBC6809でASSIT09 -- 検討編 ― 2020年09月23日 12:54
Vintage ChipさんのSCB6809でASSIST09を制限付きながら動かすことができました。 制限とはPTMが搭載されていないため、トレース機能が使えないことです。 誤動作します。SBC6809には、ACIAのクロックを生成するためにPIC12F1822が使われています。これで PTMの代替えができない物かと検討してみました。
ASSIST09で、PTMをどのように使っているのかを調べてみました。モトローラの
「MC6809-MC6809E マイクロプロセッサ プログラミング マニュアル」に掲載されている
ASSIST09のリストを読むと、PTMは2カ所に出てきます。まずは、初期化のところ、
です。
コメントにあるように、PTMのチャネル1をシングルショット動作で8ビットの二つのカウンタとして使います。クロックはEクロックです。もう一カ所は、NMI割り込みが起きたときのルーチン、
です。
次の割り込みのために、カウンタのMSBに7をLSBに1をセットし、RTIでも取ります。この時のPTMの
動作は、モトローラの「M6800ファミリ8ビット・データブック」によると、
の下の図のようになります。
この図の中で、Mは"7"、Lは"1"ですので、Eクロックの立ち下がりを16エッジ((M+1)*(L+1)エッジ)検出すると動作が終わります。
この間、15クロックを検出したら、出力パルスが出力され、これを反転した信号をNMIに入りNMI割り込みが
発生します。LSBにセットされた"1"は、出力パルスの幅です。これをさっ引いた15クロックは何を示して
いるのでしょうか?これは、STD命令に続くRTI命令の実行クロック数に一致します。すなわち、RTI命令の次の
命令の始まりでNMI割り込みを発生させることになります。この「次に命令」とは、次にトレースする命令です。
実にスマートなやり方でトレースを実現しています。
PIC12F1822で、STD命令でPTMに何かが書き込まれたら、Eクロックの立ち下がりをカウントし、15クロック目から 16クロック目にNMI割り込みパルスを発生させればなんとかなりそうです。
大筋が見えたので、PICをどう使うか検討しました。 PICに入れる信号は、/WE,/PTM(A000H),D0,E、出力は、/NMIです。Eは、TIMER#0でカウントすることにしました。 そのため、TIMER#0の入力ピンと従来のボーレイトクロックを出力するピンとぶつかるため、 ボーレイトはRA5から取り出すことにしました。その他はRA3が入力専用に注意して割り当てることに。
TIMER#0は、カウント値が"255"から"0"に変化するときに割り込みを発生させるので、これを引っ掛けて /NMIを出力すれば良いでしょう。
さて、結果はどうなるでしょうか。
SBC6809でASSIST09 ― 2020年08月17日 13:54
モトローラの6809には、ある種の憧れを持っています。究極の8bitとか、 多彩なアドレッシング・モードとか、Z80とはテイストの違い、一度は いじってみたいとずうっと思っていました。2年ほど前に、vintagechipsさんの ブログで6809のルーズキット「SBC6809」を知りました。キットといっても プリント基板一枚だけで、製作に必要な情報はネット上から、パーツは自力で 集める必要があります。こんなアプローチもあるもんだと感心していましたが、 全て自作にしたいことと、ASSIST09というモトローラのモニタをフルスペックで 動かしたいことにこだわって、このキットには手を出していませんでした。
でも、とうとう我慢しきれなくなり、キットを入手して制限付きですが ASSIST09を動かすことができました。
このSBC6809は、6809MPUとACIAの6850、ROM 8KB、RAM 8KB、PIC12F1822を 使ったボーレートジェネレーターの構成です。ASSIST09は、PTMの6840も使います。 PTMはトレースコマンドで使用していて、トレースコマンドを使用しないなら、 PTMが無しでもASSIST09は動作します。(でもやっぱりフルスペックで動かしたい。)
SBC6809自体の組立は問題なく完了しました。組立に当たり近い将来、ASSIST09を フルスペックで動かすために改造をしています。オリジナルでは、/NMIと/FIRQは Vccに直結してあるのをこのパターンをカットし、それぞれを4.7Kの抵抗でプルアップ しました。ASSIST09はトレースのためPTMで/NMIを発生させています。この準備です。
ASSIST09をSBC6809の構成に合わせるために、以下の部分を書き換えて再ビルドしました。 変更箇所は、
RAMOFS EQU -$1900 ACIA EQU $E008 PTM EQU $E000この3点をこのように変更しビルドします。
RAMOFS EQU -$D900 ACIA EQU $8018 PTM EQU $0000
書き込み元アドレスに注意してROMに書き込んで完了です。ASSIST09が動きました。
PTMの代わりをPICにさせてトレースコマンドを実装できないものか、思案中です。
SBC6809ルーズキットは、スイッチサイエンス で取り扱っています。
最近のコメント