ラベル 6802基板 の投稿を表示しています。 すべての投稿を表示
ラベル 6802基板 の投稿を表示しています。 すべての投稿を表示

2021年3月10日水曜日

ドータボード上の6502でAppleⅡのBASIC Subsetが動作

 ようやくAppleⅡのBASIC Subset を走らせることができました


他の方が努力して実現されたものを後追いしているだけなので、何の意味もないと思いますが、それなりに苦労しましたので、これからやってみようと思う方に多少なりとも参考になればと思いまして、その経過をここに残しておきます。


6502を装着した6802ボード


ハードですが、下のメモリーマップにありますように64KB(32KBx2)のRAMを実装していますが、$F000~の4KBにROMが、さらに$F080からの128byteがI/O領域となっています。


SBC6802のメモリマップ


これは6809ボードを製作した時にRAM領域をできる限り広くしたかったのと、モニタとしてASSIST09を使用するために$F000~をROMにする必要があったためで、その配置をそのまま踏襲しています。


6502については何も知識がありませんので、夢七さんのブログを見ながら、そのまま移植してみることにしました。


(1)Woz MonitorとApple1 BASIC の移植

まず最初に「SBC6800に6502を載せてApple1を体験する」を元にして、Woz MonitorとApple1のBASICを移植してみました。

幸い、Woz Monitorはメイン部が$FF00~に、$F000~$F036にI/Oルーチンが配置されていたので、ACIAのアドレスを変更するだけで済みました。

また、Apple1 BASICについては上位の32KBのRAMをROMに置き換えて、その$E000~に配置しました。


A1BASICとWoz Monitor


ソースのアセンブルですが、オリジナルのソースを夢七さんがArcpitのX6502でアセンブルできるように改変してくださっているので、

>MSDOS X6502 /H A1BASIC-WOZV1.ASM,A1BASIC-WOZV1.HEX,A1BASIC-WOZV1.LST

でアセンブルできました。

動作している様子を示します。


Apple1 BASICの動作画面


(2)AppleⅡ BASIC Subset の移植

続いて「SBC6800に6502を載せてAppleⅡBASIC Subsetを走らせる」を元にして、AppleⅡ BASICの移植に取り掛かりました。

BASICのサイズが大きいので、ブログのように$E000からアセンブルすると$F080からのI/O領域まで入ってきます。そこで、$F080~$F0FFをスキップするようにORG命令を挿入してみたのですが、そうすると$E000~$FFFFにBASICとWoz Monitorが収まりませんでした。

次に、BASICを$D000からに配置するようにアセンブルしてみました。結果、BASICは$D000~$EE46に収まりました。Woz Montitorは先のA1BASICの場合と同じように$F000~にI/O、$FF00~にWoz Monitorを配置しました。

ところが、アセンブルした結果をROMに焼いて走らせてみましたが、正常に動作しません。

何回見直してもソースやアセンブル手順に間違いはありません。6502の知識が全くないのでほとんどお手上げ状態でしたが、ソースをじっくり眺めているうちに、FDB命令がコメントアウトされて、その後ろにbyte命令でバイト列が並んでいるという形があちこちにあるのに気づきました。

試しに、FDB命令を元に戻し、byte命令をコメントアウトしてアセンブルしてみるとbyte命令のバイト列と同じようなコードが生成されましたが、よく見ると2バイトコードの上位下位が入れ替わっています。

つまり、夢七さんが改変されたソースはX6502でアセンブルするために、元のソースで使われている.addrのようなX6502では対応していない命令をFDBに置き換えるという対処をしているのですが、FDBではアドレスの上位下位が自動では入れ替わらないために、アセンブルしたコードのうちのアドレスの上位下位を入れ替える必要がある部分をbyte命令で直接記述していることが分かりました。ということで、このソースは$E000からアセンブルすることを決め打ちしているので、$D000からに変更してアセンブルしても正常に動作しないわけでした。

そこで、まずソースのFDB命令を元に戻して$D000からアセンブルし、得られたコードのアドレス部の上位下位を入れ替えてbyte命令に並べ、FDB命令を再度コメントアウトするという操作を加えることで、X6502でアセンブルできるソースができあがりました。

そのソースを改めてアセンブルし、得られたバイナリをROMに焼いて走らせてみたところ、今度は正常に動作しました。

メモリマップを示します。


AppleⅡBASICとWoz Monitor

動作している様子です。

AppleⅡの動作画面


(3)ASCIIART を走らせてみる

BASICが無事に走ったということで次はASCIIART.BASを走らせてみました。


ASCIIART結果

描画時間は手動計測ですが4分21秒程度でした。なお、システムクロックは2MHzです。

今回は元のソースに見慣れない疑似命令が使われていたために移植に手間取りましたが、それでも夢七さんがX6502でアセンブルできるように改変してくださったために、何とか移植ができました。夢七さんに感謝いたします。

移植に手間取っている間にMouserからW65C02S6とW65C816S6が届きました。このW65C02はもちろん正常に動作しました。W65C816を購入したのは、アキュムレータが1個しかない6502では6800よりもアセンブラでプログラミングしにくいと思うのですが、W65C816なら6800と同じような感じでプログラミングできるかもと思ったからです。

いつかはW65C816のシングルボードを作ろうと思っていますが、いつになりますやら。



2021年2月28日日曜日

6802ボードでドータボードを用いて6502を走らせる

 自作6802ボードでドータボード(ほうめいさんのPLDR6502)を用いて6502を走らせる


先日まごころせいじつ堂のほうめいさんから、電脳伝説さんのSBC6800ボードで6502を走らせるためのドータボードPLDR6502をいただきましたので、私の自作品で今は使用していない6802ボードでも走らせることができないものかと試みてみました。

私の6802ボードは水晶発振回路からの8MHzを6802のEXTAL端子に入力して、出力される2MHzのE信号で周辺回路を制御しているので、8MHzをそのまま入力するわけにはいきませんが、幸い、ACIA63B50に加える614KHzのクロック生成のために8MHzをLS161で13分周していますので、その途中から2MHzを取り出して、それを37ピンのPHI2Iに加えることで2MHzで動作させることができそうです。

ドータボードの修正としては、39ピンPHI2Oと37ピンPHI2Iを入れ替えることと7ピンSYNCをカットしてGNDに落とす(BAを常にLowに)だけで良さそうです。6502にはBA信号がないのでちょっと悩みましたが、常にLowにしておいても特に不都合はないようです。(本当は周辺ICのアクセスに不都合が生じる場合があるそうですが...)

問題はCPUで、eBayで調達したW65C02(5個)とR65C02(2個)のいずれも動作しませんでしたので、仕方なくオレンジピコさんからW65C02S6PTG-14を購入してようやく動作させることができました。動作しなかったW65C02はいずれもほうめいさんのブログで動作しなかったと報告されているものと同じ刻印でした...


ということで、動作している様子です。

残念ながらボード上のLS161から2MHzを引き出している線とBAをGNDに落とす線が見えていて見苦しいです...


自作6802ボード上に装着した


オレンジピコさんから購入したW65C02です。


ドータボードとW65C02



動作確認にはほうめいさんと同じように、ElectreilicさんのUniversal Monitorを使わせていただきました。モニターの開始アドレスとACIAのアドレスを変更するだけで、アセンブルしてROMライターで焼いて動作させることができました。


Universal Monitorが動作



動作しなかったW65C02とR65C02群です...



eBayでは時々こんなことが...


W65C02は全く無反応でしたが、R65C02の方は全くの無反応ではなくて画像のように意味のないデータが定期的に表示されており、一見何かの動作をしているように見えます。



もっと追求すれば何か分かるかも


ここまでくると、次はBASICを走らせてASCIIARTの描画速度を測定してみたいところですが、私の6802ボードはROMが$F000~$FFFFのみ(I/Oは$F080~$F0FF)ですのでBASICをROMに焼き込むことができません。
ですので、起動後にBASICをRAM中にLoadして走らせる必要がありますが、6502の機械語は全くいじったことがないので、Loaderを制作できるのはもう少し後になりそうです。

初めて触れた6502ですが、折角の機会なのでもう少しいじってみようと思いますので、W65C02と使いこなせるかどうかわかりませんがW65C816を追加注文したところです。

私は、今は6809と6802の両用ボードを使用していますので、6802ボードは眠っていたのですが、それを活用することができてありがたいです。
ドータボードPLDR6502を下さったほうめいさんとUniversal Monitorを制作して公開されているElectreilicさんに感謝いたします。ありがとうございました。


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)も同梱しておきます。

2018年4月26日木曜日

修正済みの基板が届きました


最初の基板のミス等を修正した新しい基板が届きました。
前回と同じ6802用と6809用2種に加えて、6809EP用変換基板も作ってみました。
新基板(6802用と6809用RAM32KB版)
新基板(6809用RAM128KB版とEPアダプター)

EPアダプターは小さいので複数並べてV-CUTを指定してみましたが(これも初めての経験)、その通りに作ってくれて満足です。

組み立て済み
組み立て済み

回路のミスがないことを確認した後、組み立ててみましたが、無事に動作しました。











EPアダプターとUSB-シリアル変換基板を装着

EPアダプターで6809EP(私の手持ちのものはHD63C09RPとHD63C09EPですが)を動作させてみました。
回路基板は何も変更せず、アダプターを装着するだけで動作します。

EPアダプターの下部の余白部を用いてUSB-シリアル変換基板用のソケットを作って装着してみました。(画像の右端)






ということで、最初の基板のうち動作確認に使用したもの以外は不要になりましたので、もし使ってみたいという方がおられましたら、郵送料のみ負担していただければお分けしたいと思います。各基板とも2,3枚ずつあります。
(パターンカットは済んでいますが、下画像のような追加配線が必要です。)

基板修正の様子(左から6802用、6809用RAM32KB版、同128KB版)

もしご希望の方がいらっしゃいましたら、お知らせください。