CPMやTK-80用のプログラムを書いていると往々にしてインテル記述のアセンブラソースと向き合うことになる。MZ-80やPC-8001などのZ80系列でアセンブラを覚えた身だとザイログ記述の方が馴染みが深い。8086以降のMASMなどでアセンブラを学んだ人たちの方が8080用のインテル記述のアセンブラは飲み込みが容易いと思う。そんな折にインテル記述のソースをザイログ記述に変換するツールが無いかと探して見つけたのが Xlate https://github.com/mnarigon/xlate xlate-8080 [-cl] [-o file] [file] インテル表記をザイログ表記に変換、出力指定なしだと標準出力に結果を吐き出す。 xlate-z80 [-c] [-o file] [file] ザイログ表記をインテル表記に変換、 出力指定なしだと標準出力に結果を吐き出す。 Z80にあって8080に無い命令はCPM用のMAC80に含まれるZ80マクロz80.libに準拠したモノに置き換えられるらしいが z80.libにZ80固有命令を8080用に置き換えるようなマクロは含まれていないので当てにしないのが無難ではある。
もともと、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を...