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

テクトロニクス グラフィックターミナルエミュレータ tek4010

大昔のメインフレームとかには、出力装置はプリンタぐらいしかなく。シリアル接続の端末の画面に出すのは、一時的な作業状況程度の文字情報のみだった。記憶装置としては紙や磁気のテープやハードドライブがついてる程度かな。音楽も演奏できないし、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の動作動画を以下に
 

以前、あげた動画と同じ内容ですがこちらは
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((y >> 5) | 0x20);
    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)
 
となります。当初 2120行のint(Y1/32)と2140行のint(X1/32)の「int」が無くて、割り算の小数点以下の数が原因でY軸の点の位置がブレてました。 
 

で、これが 修正した 描画プログラムの 出力になります。
ついでに、点描じゃなく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に描画出力できました使いづらいです。
 

コメント

このブログの人気の投稿

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