6809用のGAME インタプリタとコンパイラを作成した方の記事を見つけた。
https://flexonsbd.blogspot.com/2024/03/6800game6809.html
有り難いことにソースを公開して頂いているので、早速入手してSBC6809上で動くように修正を試みる。今現在の自分のところのSBC6809にはBASICとモニタが載っており これらがダイレクトページの0番の取り合いをした結果、BASICが0ページを取り、余裕を見てモニタが3,4ページを使い。GAME09には6,7ページ辺りを割り当てることになる。
コレに伴い、0ページへのダイレクトインデックスでの読み書きをしている命令への修正が必要になる。
GAME09の元になるのは6800系用のGAME3がベースだったらしく。
6800にはDPレジスタはなく、ダイレクトインデクスで扱うのは0000番地からの256バイト分が前提になる。
インタプリタの修正で見つけた変更点は
その1 スタックの扱いについて
6800版
0049 0115 8E 00FF MAIN LDS #STACK1
0196 0204 BE 0116 EDEND LDS MAIN+1
0645 04BF BE 0116 ELSE LDS MAIN+1
6809版
0047 011B 10CE 00FF MAIN LDS #STACK1
0188 0218 10FE 011C EDEND LDS MAIN+1
0628 04F6 10FE 011C ELSE LDS MAIN+1
6809ではLDSは2バイト命令になるので、EDENDとELSEラベルの「MAIN+1」は「MAIN+2」にしないと
意図した$00FFがスタックSに格納されない。
若しくは、スタックSではなくスタックUを使うようスタック関連の命令を変えると1バイト命令になるので
オブジェクトのバイト位置を利用したテクニックには影響が出ないかも?(この辺は自分ではやってないので未検証)
その2 変数の扱いについて
6800版
0403 034F 4F ADRVAR CLRA
0404 0350 C4 3F ANDB #$3F
0405 0352 CB 02 ADDB #2
0406 0354 58 ASLB
0407 0355 DF 70 AV1 STX $70
0408 0357 7E 051A JMP TSTZR0
6809版
0390 0372 4F ADRVAR CLRA
0391 0373 C4 3F ANDB #$3F
0392 0375 CB 02 ADDB #2
0393 0377 58 ASLB
0394 0378 9F 70 AV1 STX $70
0395 037A 16 01D9 LBRA TSTZR0
コレについての説明は別の方のページに的確な説明があったので引用させてもらって、
ttps://www.zukeran.org/shin/d/2024/06/04/bm-development-environment-8/より引用
実は、GAMEでは、記号が特殊変数として利用できる。上の表の & ' * = がそれだ。先ほどのADRVARサブルーチンでは、これらの特殊変数のアドレスも同じ式で計算していた。
例えば、 & ($26) なら、AND #$3Fしても$26、2を足して2倍すると$50。表の通りである。ここに対してダイレクトアドレッシングでアクセスしていたので、その部分も変更しないと動作しない。
結局、$41-$5F,$20-$3F までの連続する$3F個(63個)の2バイト変数領域が必要で、これだけで126バイトを使ってしまう。これをGAME-MBのように全部0ページに残すかどうかの判断が難しいが、今回は全部別ページにしてみた。特殊変数だけ0ページに残すのが良いのかもしれないが、後で考えよう。
----------引用 終わり。
引用元の「ず」さんの対処法については記述が見当たらないので不明ですが、
私自身は変数の表記をすべて強制的に大文字に内部変換することで対処しました。使用可能変数が減るのは勿体ない気がしますが
26個の変数だけでもかなりの事が出来ていたので、コレでヨシとします。
私の動かしてる環境では、0ページはBASIC09のワークに、更にモニターも0ページを使っていたのを無理くり移動させての後に
GAME9用に$06,$07辺りにワークを移動させたりしてるのでその辺の弊害も有るのでアセンブラソースは無茶苦茶なモノで…。
PC上のエミュでインタプリタ単体で動作させて、ソースをコピペで読ませてMAZEやオセロもどきが実行できたのは確認した。
コメント
コメントを投稿