予てより取り組んできた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 テキスト形式 ソース
ascart.bs メモリストレージ形式 ソース エミュ専用
ascart2.bs メモリストレージ形式 ソース エミュ専用(タイマによる実行時間計測付き)
debugtest.py
detoken.py BS形式のソースをテキスト形式のBASソースに戻す ツール
エミュ上でプログラムしたソースも保存形式がBSなのでPC上で扱いやすい形に戻すため
g2gb.py テキスト形式のGAME9ソースを メモリストレージ形式のソース GB形式に変換するソース
PC上で作成したソースをエミュに持っていくためだけのツール
エミュにGAME9のソース保存機能を用意していないので逆は用意していない。
graph.bas 3DHAT表示プログラム PC上にtek4010エミュレータが必要 テキスト形式のソース
graph.bs メモリストレージ形式 ソース エミュ専用
lifegame.g ライフゲーム GAME9用 テキスト形式のソース
lifegame.gb メモリストレージ形式 ソース エミュ専用
matrix.bas RND関数の扱いがExBASICと合わないので多分これは動かない。参考用
matrixrain.bas ExBASIC用に修正を掛けたもの テキスト形式のソース
maze.g GAME9デモでお馴染みの迷路デモ テキスト形式のソース
maze.gb メモリストレージ形式 ソース エミュ専用
maze.hex コンパイラ済みの実行オブジェクト
mrain.bs matrixrainのメモリストレージ形式 ソース エミュ専用
othello.g リバーシゲームのテキスト形式のソース
othello.gb メモリストレージ形式 ソース エミュ専用
sieve.g エラトステネスのふるい テキスト形式のソース
sieve.gb メモリストレージ形式 ソース エミュ専用
test1.bs
$ python detoken.py test1.bs
; 6809 ExBASIC DETOKENIZER
; Powered by OpenAI + GPT-5.5-mini
; BASE=$021B END=$02A5
10 POKE &H8000,0
20 A=PEEK(&H0218)*256+PEEK(&H0219)
30 FOR I=0 TO 10000:NEXT
40 B=PEEK(&H0218)*256+PEEK(&H0219)
50 PRINT B-A
60 END
$8000に0を書いてるのは、タイマー始動 命令のつもり 今はこの機能外してるので無意味
初期は ここに何か書き込むだけで、タイマの停止・始動を切り替えてた。
タイマの値を 0に初期化したいときは、$218,$219に0を書けば0からカウントが始まる。6809なので$218が上位 $219が下位
書き込んだ瞬間からカウントが始まるので、細かなタイミングの調整はほぼ無理。
test3.bs
$ python detoken.py test3.bs
; 6809 ExBASIC DETOKENIZER
; Powered by OpenAI + GPT-5.5-mini
; BASE=$021B END=$0246
10 FOR I=0 TO 127
20 PRINT CHR$(I);
30 NEXT
40 END
ただのアスキー文字一覧出し
time.bs
$ python detoken.py time.bs
; 6809 ExBASIC DETOKENIZER
; Powered by OpenAI + GPT-5.5-mini
; BASE=$021B END=$0270
1 POKE &H0219,0:POKE &H0218,0
10 POKE &H8000,0
20 PRINT PEEK(&H0218)*256+PEEK(&H0219)
30 GOTO 20
タイマの数値が上がっていくのを見るだけ
load timetest2.bs
BS load: 0218 -> 021B offset=3
Entry=021B
SD:>go
Go
SD:>
Vset :DBDC
Uart :8018
OK
LIST
10 POKE &H0218,0:POKE &H0219,0
20 PRINT PEEK(&H0218)*256+PEEK(&H0219)
30 GOTO 20
OK
ExBASIC(BasROM)でプログラムして保存すると、ソースの格納位置が $218からになる
BASIC9ではタイマのカウント数値が$218から保持される。 ので ソースの格納位置が $21bからになっている。
エミュ内蔵のローダはこの違いを検知して、BasROMで読もうとしているのか、BASIC9なのかを検知している。
なので、気にすること無く ロードしてインタプリタに復帰すればLIST表示できる。
が、detoken.pyはこの違いを 把握していないので BasROMで作ったBSファイルはPC上で操作できない。
token.py
テキスト形式の BASソースを BS形式に変換するツール
SD:>help
Commands: DIR, TYPE, ERA, REN, LOAD, GO, VSET, UART, DUMP, SAVE, HELP
DIR SDカードのファイル一覧
TYPE テキストファイルの表示
ERA ファイルの削除
REN ファイル名変更
※注 ERAとRENのみファイル指定時に ファイル名の頭に/記号を付加する必要あり
LOAD 拡張子で内部で呼び出すローダを切り替えている。
対応ファイルは BIN,S19,MOT,HEX,GB,BS
SAVE 拡張子で内部で呼び出すセーバを切り替えている。
例:
SAVE TEST.BIN 1000 1FFF
SAVE TEST.BS
DUMP メモリダンプ
DUMP xxxx nnnn
xxxx: 開始アドレス
nnnn: バイト数
UART ACIA用のポートアドレス
VSET リセットベクタにアドレス設定する
※注 HEXファイルなどに ベクタ情報があれば設定される。
引数無しで呼べは 現在の設定値が見れる。
GO エミュレータにリセット動作を指示する
ACIAのキー入力中に CTRL+D の入力があれば エミュレータの動作を中断してSD>プロンプトに戻るようになっています。
当然キー入力のないプログラムでは中断機能は効きません。その場合はリセットボタンで強制中断するしか手段はありません。
virtual6809_esp32_gpt01/
このフォルダに、エミュレータ関係のファイルを収めています。
arduino+esp32の環境を構築後にビルドすれば書き込める状態です。
vga関係の機能はまだ一切組み込んでいないので問題ないですが FabGLライブラリを使う予定ならば、
esp32のライブラリは 2.0系と3.0系がありますが 2.0系を選んでください。FabGLとの相性の問題で3.0系ではビルドが通りません。
この時点での、エミュレータの構成には 外部ポートはACIAしか持ち合わせていません。純粋なSBC6809と同じです。
6809プログラムからSDカードが読み書きできるAPIすら用意していません。
メモリ構成は $0000−$7fffまでがRAM $8000-$ffffまでが ROM/IOエリアになります。
$8000以降はROM扱いなので 6809側からの書き込みは弾きます。IOエリアの$80xx(UART設定が$8018の場合)はIOエリアとして書き込みを受け付けます。
実機のSBCの場合、$8018の鏡像が $8000-$8fffの全域に出現しますが。このエミュレーターでは $8018に設定すれば そこ以外には 反応しません。
これは、UARTアドレスが $a000だったり、$e000だったりする 他人の作ったプログラムを実行するためだけの機能です。
少しでも広くROMエリアを確保したい場合は $fe18辺りに UARTを設定するのも可能です。
公開するものには ほぼ全て ソースファイルを付けてますので 各自で改良するもよし、不具合を見付けたら 自分で修正するも良しです。
コメント
コメントを投稿