大昔のメインフレームとかには、出力装置はプリンタぐらいしかなく。シリアル接続の端末の画面に出すのは、一時的な作業状況程度の文字情報のみだった。記憶装置としては紙や磁気のテープやハードドライブがついてる程度かな。音楽も演奏できないし、3DグラフィックスをリアルタイムでFPSいくらでとかありえない世界だった。そんな中でもゲームを作ってやってた連中がいた。文字だけで構成されたログーとかのRPGやスタートレックなんかが有名だが、アステロイドのようなワイヤーフレームグラフィックを使ったゲームをやっていた連中もいる。そこで使われたのがテクトロニクスのTEK4010シリーズの端末。純粋にコンピュータからシリアル経由で送られてくるテキストデータを利用して、画面上にプロッタのような描画をこなす。WindowsだとTeratermにこれの機能が組み込まれてるので普通に使える。実はlinuxでもXtermに「-t」オプションで この機能が内蔵されてる。が 残念なことにfedora40辺りから Xterm -t で起動しても即落ちして全く使えない状態になってる。Xtem自体が永らく更新が滞ってるらしく。X11のサーバーなどの更新に追随できてないようだ。
で、このTek4010の有り難いのは、グラフィック機能のないワンボードマイコンにシリアル接続さえできれば、計算結果のグラフ程度なら描画させることができる。流石にインベーダーゲームとかは無理っぽいけど、昔あった「ミステリーハウス」的なゲームならやる気が有ればできるかも?
と、前置きはこれくらいで Z80-MBC2のCPM上で動作する グラフ描画プログラムの出力をTek4010エミュで受けた時の動きの動画を
MBC2から送られたデータで、円とひし形、最後に3Dハットの点画を描画します。
そのあと、GAME-CCのMAZEを動作させてみましたが、グラフモードだとANSIやVTのエスケープシーケンス受け付けないので、画面が崩れてダメでした。
そのあと、GAME-CCのMAZEを動作させてみましたが、グラフモードだとANSIやVTのエスケープシーケンス受け付けないので、画面が崩れてダメでした。
そこで改めて、通常端末でのGAME-CCのMAZEの動作動画を以下に
以前、あげた動画と同じ内容ですがこちらは
Z80 実機 8Mhz動作、USBシリアル115200 での接続状態での動作です。
画面だけで、音もBGMも解説も何もない動画です。
で、このTek4010エミュですが ローカル上の 標準出力を受けて線画を描画することもできるので(というか、こちらが作者の意図した利用方法らしい) Linux端末上でCPMエミュの出す標準出力を受けて、先程と同じグラフ描画をさせたもの、前半はhi-tech-Cでコンパイルしたグラフプログラムの様子で、 その後 円、ひし形と続き MBASICで同じグラフ描画をやってるんですが、X,Yの座標計算のミスで描画が崩れてます。
で、MBASICの出力は、当初 そう言ったものかと思ってたんですがCのプログラムと比較しても動作に違いがないので、MBASICそのものの内部での計算誤差とかで納得してたんですが、最終的にわかったのは
C言語での
座標変換
putchar((x >> 5) | 0x20);
putchar((x & 0x1f) | 0x40);
putchar((x & 0x1f) | 0x40);
putchar((y >> 5) | 0x20);
putchar((y & 0x1f) | 0x60);
putchar((y & 0x1f) | 0x60);
が
BASICだと シフト計算が出来ないので
2120 a=&H20+int(Y1/32):call putchr(a)
2130 a=&H60+(Y1 AND &H1F):call putchr(a)
2140 a=&H20+int(X1/32):call putchr(a)
2150 a=&H40+(X1 AND &H1F):call putchr(a)
2130 a=&H60+(Y1 AND &H1F):call putchr(a)
2140 a=&H20+int(X1/32):call putchr(a)
2150 a=&H40+(X1 AND &H1F):call putchr(a)
となります。当初 2120行のint(Y1/32)と2140行のint(X1/32)の「int」が無くて、割り算の小数点以下の数が原因でY軸の点の位置がブレてました。
で、これが 修正した 描画プログラムの 出力になります。
ついでに、点描じゃなくLINE描画に変えてみました。
ついでに、点描じゃなくLINE描画に変えてみました。
おまけで、linux環境下の純粋なBASICでの出力をTek4010送って出したいと思って用意したEndBASICが とんでも仕様で、Tek4010に必要な0x1d,0x1fと0x20から0x7fまでの文字データの出力が出来ないので、EndBASICでは0x20以下0x7e以上の文字データは0x20の置き換えて出される仕様でTek4010エミュとは相性最悪でした。辛うじてEndBASIC自体がSDLでグラフ表示機能があるのでそれを使っての描画をサンプルとして出してみます。
このEndBASICもGAMBASのサブセットぽいんですが、扱える数値が10進しか扱えないとか
&Hや0xFFとか使えません。絶対値だすABS関数とかもないです。
あと、Tek4010にCPMエミュでいろいろ出してますが、Githubで公開されてる 状態のCPMエミュだと、データにゴミが混ざって正常に描画できません。
0x1dでグラフモード、0x1fでテキストモードの切り替えと グラフモードの間は 0x1fのデータが来るまでは0x20から0x7fの文字データを一切加工せずに出すように細工しないとダメです。
唯一 ntvcmっていうエミュが普通にビルドしたままでTek4010に描画出力できました使いづらいです。
コメント
コメントを投稿