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

投稿

インテルとザイログのニーモニック相互変換について

 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用に置き換えるようなマクロは含まれていないので当てにしないのが無難ではある。  
最近の投稿

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

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

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

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

こんな細工をしてみた

この夏、2度ほど冷蔵庫のドアが数時間半開きだったのに気付かずに居たことがあったので、ドア警報のようなものがあればと思っていたところ。100均に「磁気スイッチ式LEDライト」が売られていたのでこれを買って、さっそくNANDゲート2個で簡単な発振回路を組んで繋いでみた。 ボタン電池で2、3日くらいの持ちだが、音が不快な高周波な上に隣の家にまで届きそうな勢いの音量だったから更なる改善の予定。

SP-5030にテキストデータを送る方法

すごい消極的な手段だが、linux上で作成したテキストファイルをSP-5030に読ませる方法を確立した。 要は、行の長さ(2バイト)、行番号(2バイト)があれば 後ろがベタテキストでもリスト表示まではやってくれる。後はSP-5030にリスト表示させて、ひたすらエンターキー叩いて、中間コードに戻してもらう。中間コードへの変換漏れがあっても きちんと実行時にエラーになるのでOK。1行あたりの長さを80文字以下にしないとDATA ERRORになって、最悪SP-5030が暴走する。 具体的に使うのは、マクロ機能とキャラクターマッピング機能のある「zasm」を使って見た目はアセンブラのソースの形で作成する。 obj_top: ;BASICプログラム開始位置宣言 line 50,' dima(9),b(9):v=53248:e=1:f=40' line 60,' a$="c0g0c0g0c0g0c0g0c0g0c0g0c0g0"' line 70,' a$=a$+a$+a$+a$+a$+a$+a$' line 80,' limit24063:gosub11000' obj_end: end ;BASICプログラム終了位置宣言 実際には、この前後にアセンブラのための宣言文やキャラクタマッピングの定義なども含まれるので、 地底最大の作戦をテキスト化した参考ファイル を上げておく。 これを使うのには、 MZフォント と zasm が必要です。

MZ_Trekの64bit linuxでのビルドについて

http://www.bsddiary.net:80/mz_trek/で公開されている(9月5日時点でサーバーが不明と出てくる?)MZ_Trekの動作の要のparserってのが、SP-5030サブセットで普通の端末で動作してくれるので、BASICプログラムの簡易テストに便利かなと思ってビルドしてみたんですが、まったく動かず? 単純なFOR文10回ほどのループデすら無限ループになる始末。YACCのどこかに問題があるのかとつらつら眺めても門外漢でさっぱり。XPでは問題ないらしいと聞いて、MakeFileのCFLAGSに-m32オプションを付けて、32bitオブジェクトを吐くようにしたら動いた。64ビット化は誰かにお任せ。