スキップしてメイン コンテンツに移動

投稿

8月, 2026の投稿を表示しています

SBC6809モドキを作ろうとしたら、MZ-6809が出来ていた件 その5

 予てより取り組んできたSBC6809エミュの関係ファイルを 書庫にして公開 する。 とは言え、未だ 完全な完成には程遠いので恥ずかしい限りではある。 書庫サイズは390キロバイト弱になる、以下の文書は その中に収めた 但し書きの写しになる。  ----------------------------------------------------------  EXBASICから USING命令を削除した軽量版 タイマ割り込みを利用した簡易時計機能付き BASIC9.asm BASIC9.hex BASIC9.lst BASIC9.mot BASIC9.sym DBDC 12               BAWMST  NOP hotstart : $DBDC ExBASIC 気になる部分のバグ修正したのみ。ほぼ原版 BasROM.asm BasROM.hex BasROM.lst BasROM.mot BasROM.sym DBCB 12               BAWMST    NOP  ;NOP REQ-D FOR WARM START hotstart : $DBCB HD6309チェッカ 現時点での このエミュレータでは無意味 CHK309.asm CHK309.lst CHK309.sym EXBASICソース構造参考.txt GAME09.asm GAME09.hex GAME09.lst GAME09インタプリタ COLD :$9000 HOT :$9003 これにはリセットベクタ情報は含まていないので、ロード後の初期起動時もVsetでベクタ設定が必要。 BASIC,GAME09 共通で ロード後 一度コールドスタートさせて CTRL+Dで CCPに戻り loadでソースをロード vsetで ホットスタートアドレスを設定、GOでインタプリタに戻り プログラムの確認、実行という手順です。 コンパイル済みのGAMEバイナリは 共通で$2000が実行アドレスです。 マンデルブロ集合 アスキアート表示デモ ascart.bas...

SBC6809モドキを作ろうとしたら、MZ-6809が出来ていた件 その4

 GAME-CCのやらかしバグについて まず、問題のファイルは ランタイムパッケージに相当する 「gamecc.asm」の中の W82            RMB        6+1            ; DIVIDE BINDEC/WORK ;            FCB        0 この箇所、これ gamecc.asmの終わりの方の、ほとんどRMBの並んでる中、ただ1バイト分 0をメモリに書き込んでる。 そこだけピンポイントで0格納するようにHEXファイルが生成されれば無駄もないんだが、 アセンブラの種類によっては前後のRMBブロックもゼロフィルして無駄に大きなHEXファイルになる。 W82は6バイト確保だったのを7バイト確保にしてFCBを消したんだが、一見これでも 動作はする。 メモリというものが、電源入れた直後に全てゼロになる前提なら。今回のエミュはそうはいかない。 メモリの確保イコールゼロで初期化まではやっていない。実機でもSRAMにしろDRAMにしろ電源投入直後は電気的には不確定なのが通常で ROMから起動したモニタがメモリをゼロフィルしてメモリの正常動作を確認するのが一般的な初期動作になる。 これまでにテストで使ったlinux上のエミュはメモリのゼロフィルが当たり前だったのが災いした形になる。 この6バイトは、数値の左詰め表示のための結果格納バッファで符号のための1バイト、1から32767までの5桁を入れる5バイトの合計6バイトになる。 そして、GAMEの内部処理では文字列は0終端の集合として扱って表示しているので、数値文字列の終わりのための0を入れる7バイト目が必要になる。 これを端折ったため、maze.hexのオブジェクトのエスケープシーケンスでカーソル位置指定する計算式で 結果が正しく出されずに謎文字列の羅列が爆発するバグにエミュレータ作成初期に悩まされた。 BYNDECルーチンのリターン直前に W82+7の位置に0を書き込むコードを挿入して回避するように修正。 エミ...

77AVEMUのGUIを使いたい

 githubで公開されてる、FM-7/77/AV系のエミュレータでlinux環境でも直で使える エミュとして唯一あるのが 77AVEMUであるが、ビルドの為のライブラリ導入のため目的のエミュ本体よりデカいTOWNSEMUを必要としたり、GUIが使えますと案内するが肝心のGUIのビルド方法については全く説明がないとか 謎仕様の塊で なかなか敷居の高いエミュなんだが 決して完成度の低いわけではないので ターミナルからCUIで使うか、pythonでも使って自前でフロントエンドでも作るかすれば済む話ではあるが、せっかく作者の方が用意してくれたのに使わないのはストレージの肥やしとしても勿体なさ過ぎるので、chatGPTとアレコレ対話しながら悪戦苦闘して 何をどう修正したとか 細かく説明したり、diffとってパッチファイルにするとかとてもじゃないが面倒なので、必要なファイル放り込んだフォルダごとZIPにしたので約240Mとデカいファイルだが 必要なら各自で ダウンロード して試してみて。最低限やった内容はHowToってテキストに書いてるけど あとは 各自でchatGPTにでも相談して解決して。    

SBC6809モドキを作ろうとしたら、MZ-6809が出来ていた件 その3

 今回も動画からですが、物凄い地味な動画からです。とは言え、内容的には大きな成果ではあります。  地味な割にじっくり見てもらいたい部分があるので、 ダウンロード推奨 です。 お馴染みのBASIC9を読み込んで起動させ、time.bsという数行の簡単なBASICプログラムを走らせてます。一見ただ画面の左端を数字がカウントアップしてるだけの5秒位の動きですが、  --------------------------- 1 POKE &H0219,0:POKE &H0218,0 10 POKE &H8000,0 20 PRINT PEEK(&H0218)*256+PEEK(&H0219) 30 GOTO 20 ---------------------------- 中身はこんな感じです。メモリの0x0218と0x0219に0を書き込んで後は繰り返し読み出して表示しているだけです。これESP32からおよそ100ミリ秒のタイマー割り込みを受けて。1秒毎にカウントアップするようになってます。 動画編集ソフトのAvidemuxで1から2に変わる境目が 1:14.333 2から3に変わる境目が1.15.366 なんで おおよそ 1秒で1カウントアップする感じになってます。   でそれを踏まえて、アスキー文字でマンデルブロ図形を表示するプログラムの開始と終了の時間差を出して 130秒前後 の結果が出ました。 このタイマーの元ネタは  JR2XZY ブログ  の シリアル通信速度自動設定編  に出てくるPICの出力を見てたら、GPIOピンが一本空いてるのに気が付いて、見たらおおよそ100ミリ秒のパルス出てるのを見付けて、タイマーモドキに使えない?って考えて 実機のSBCのFIRQに送ってイロイロやっては見たけど 結局動かず。FIRQの処理中に次のパルスが来て無限ループしてるからかとか考えて、FIRQの処理中はパルス止める手段を加えないと無理かななんて思っていたんですよ で、エミュレータの中ならその辺はどうとでもなるかなとやってみたんですが 特に パルス止める処理とか必要なかったです。上に出てるBASICプログラムの10行にある 0x8000番地に0書き込んでるのは、リセット直後...