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

GC80FIXにI/O操作命令を Z80-MBC2でLチカがやりたい

 もともと、GAME言語には外部の機械語ルーチンを呼び出す機能はついている。だがパラメータのやりとりは前もって決めた特定のメモリに書き込んでやるしかない。以下のやり方はGC80限定のやり方になるが GAME内部では変数の管理はHLレジスタを使った2バイト単位で扱っている。当初 単純に変数Aから変数Bにコピーする動作だけでHLレジスタに変数Aの内容が保持されて 直後に機械語ルーチンを呼び出せばHLレジスタの値(変数Aのコピー)が渡せると考えたのだが、実際は機械語ルーチンの呼び出しの際にHLレジスタのデータは破壊されて別のモノに代わっている。裏レジスタなどのあるZ80でなら回避策もあるのだが、もとのGC80の作者への敬意のためにもZ80の命令をGC80には組み込みたくない。そこで、変数の扱い方についてみて見たところ、2バイト配列に変数を代入する際に一時記憶として配列の基準変数(ポインタ)の値がDEレジスタに保持されることに目をつけた。DEレジスタにあるポインタを機械語ルーチンに渡し、そのポインタをもとにデータをやりとりすれば複数のデータのやりとりも、戻り値の受け取り先にも利用できる。これを踏まえてGAMEではメモリマップドIOの操作は出来るがIOアドレスへのアクセス命令が組み込まれてないので、Z80-MBC2のGPIOやRTC,USRLED,USRボタンなどへの読み書きが直接できない。

10 U=&
13 "Press USER key to exit" /
14* LEDUSER = 0 : REM USER LED write Opcode (0x00)
15* KEYUSER = 128 : REM USER KEY read Opcode (0x80)
16 "Now blinking..." /
18* OUT 1,LEDUSER : REM Write the USER LED write Opcode
19 U:2)=1 U:3)=0 U(0)=U >=$0106

 もとはBASICでUSERLEDのチカチカ動作のサンプルをGAME言語化したモノの一部

配列変数U 2バイト目にポート番号 3バイト目に書き込みデータを代入。
配列変数U 0バイト目と1バイト目に(この場合2バイト配列の0番として)変数Uを代入すると
DEレジスタに変数Uの値が保持される。直後にIO-OUT命令の外部ルーチン($0106)を呼び出すと
機械語で言う「OUT 1,0」が実行されて戻ってくる。

GC80のランタイムに $0100からはプログラム本体の先頭位置の呼び出しのエントリを
$0103はIO-IN命令のルーチン、$0106はIO-OUT命令のルーチンへのエントリーを記述している。

IOのIN/OUTの追加だけなのでランタイムパックのサイズ的にはさほど増えてはいないが先々機能追加をしていけばランタイムパックの肥大化につながる気がする。

C言語でいう、#includeのようなプログラム側から必要なルーチンだけ組み込める仕組みを考える必要があるのだが、むやみにローカル命令を組み込むのはどうなのかという気もするので思案処ではある。

GC80FIXコンパイラ本体は変えてないので、ランタイムパックgame80.gggと参考uled.g rtc.g ほか エラトステネスの篩いでの素数出しのサンプルを書庫にしたものを4sharedに上げる

https://www.4shared.com/s/f1nfvoq2Lfa

当面、サイズを圧迫しないので思いつくのは、AND,OR,XOR,NOTの組み込みかな。
実数が扱えるようになると、それはそれで広がりが出るとは思うんだが難しい。

コメント

このブログの人気の投稿

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