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

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    テキスト形式 ソース
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を設定するのも可能です。

公開するものには ほぼ全て ソースファイルを付けてますので 各自で改良するもよし、不具合を見付けたら 自分で修正するも良しです。

コメント

このブログの人気の投稿

screen コマンドでの コピーペースト転送の実現について

 以前、GAME言語のあれこれについての中で、GAME80ICなどでZ80-MBC2とのscreenコマンドでのシリアル接続中にソーステキストのコピーペースト転送ができない事に触れていたが、単に使ってる環境に依存した所謂「おまかん」なのだが、回避したければ、素直にwindowsで使うか 若しくは linuxでもwine上でteratermを使えば済む話ではある。だが、我が家に於いては普段使いにできるwindows機など無い。棚の奥を探せばwin7の入った古PCが有るとは思うがボードマイコンとの接続の為だけに引っ張り出してきたいとまでは思わない。そこで ふと考えるにteratermにあってscreenやcu,minicomにないものはと、teratermには、テキスト転送中に行単位、文字単位でミリセカンドのディレイを挟む設定がある。対してlinux系のシリアル接続コマンドにそういった類のモノを知らない(単に自分が知らないだけの可能性もある) 。そこで、duckduckgo検索のサービスである「Duck.AI」に聞いてみた。自分の思いついた革新的なアイデアは大概は先人が既に思いついてる当たり前過ぎるモノというのはいつもの事であっさりと解決策を教えてくれた。

一部の関西の人にしか通じないネタ

たぶん「30年モノ」くらいだと思う?  拡大 値札に注目! ちなみに、ATMEGA32へのファーム書込用のアダプタを作るのに使用。

GAME言語 あれこれ

 MZ-700用にSDカードからMZTファイルの読み書きが出来る基板を入手して以降、MZ用のインタープリタやコンパイラの打ち込みをやってた延長でZ80-MBC2上のCPMで動作するGAMEインタープリタとコンパイラをいくつか発見。GAME-MZは国会図書館のコピーサービスで当時のアスキー誌の記事を入手済で打ち込みMZT化は済んでいるが動作の確認はしてない。 CP/M-80で動作するGAME80言語を3点ほど紹介する。 まず、動作環境は実機としては8Mhz動作のZ80-MBC2にXMODEMでPCからのファイル転送 PC側はFedora40の端末から「screen」コマンドでの接続、比較用に同じくFedora40の端末上で動作するCPMエミュレータ2種類。エミュレータで動作確認がとれたモノを実機に転送して最終動作させてみる流れ。    skyriverさんのGameOnCpm80 端末のエミュレータ上ではコピーペーストによるソースの転送もできるが ファイル読み書き用のコマンドが組み込まれているので、なぜか実機の方ではコピペに転送が出来ないのでありがたい。コンパイラも組み込まれているのでインタプリタで実行確認後、コンパイルもできる。 難点は、コンパイルの際にソース格納アドレスやデータエリア、オブジェクト格納エリアの指定をする必要がある。GAME-MZでもコンパイルの際は普通に必要な事ではあるが、自分の頭の中でシステムのメモリマップを把握しておくのが意外と面倒くさい。 コンパイルで 出来たオブジェクトをCOMファイルにするのにDDTなんかの別ツールでメモリ上に残ってるデータをCOMファイルとして保存するしかない。 COMファイル化とかを視野に入れずインタープリト、コンパイル、実行だけなら使いやすくお薦め。   ファイル操作コマンド例 files ファイル一覧表示 :\\ *.g 拡張子 .g のファイルの表示      \\のみ、\\ *.* での表示は出ない模様(単に自分の使い方が悪いだけかも?)  save(¥>FileName)とload(¥<FileName) 詳細は https://piclabo.blog.ss-blog.jp/CPM80GameCompiler...