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

GAME09

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やオセロもどきが実行できたのは確認した。 

コメント

このブログの人気の投稿

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...