• へびつかい座ドローライン

8 bit CPUを搭載したBASICマシンが国内で発売され始めたのは1978年から1980年あたりである。多くの電機メーカーが、当時「マイコン」と呼ばれたマシンを発表した。このとき、ほとんどのメーカーのマシンでは、Zilog社のZ-80が採用されていて、BASICは、Microsoft製だった。MicrosoftのBASICには、LineやCircle命令があり、グラフィックス描画が可能だった。

当時筆者が使っていたMZ-80Kは、40文字×25行モノクロの表示が可能で、1文字文を縦横2分割した文字パターンが用意されていた。これを使うことで80×50ドットモノクロのグラフィックスが可能だったが、当時のシャープBASICには、グラフィックス命令は用意されていなかった。

なければ作るしかない。グラフィックスの処理は、点、線、矩形/円と階層的になっていて、点を打つ機能があれば、これを組み合わせて線を引くプログラムを作ることができる。さらに線を引くことができれば、これを使って矩形を作ることができる。

まずは、点を打つルーチンを作ることにした。キャラクタパターンでの表示なので、点を描画する前に、現在の文字コードを取得して、前に描画したドットを書きつぶさないように点を打つ。次は、線を引くルーチンである。これが意外に難しかった。

Z-80は整数演算のみで、乗算、除算命令がない。かなり工夫しないと、グラフィックス描画も困難だった。乗算は加算の繰り返し、除算は減算の繰り返しに変換する必要があった。

今ならば、インターネットで「ググ」れば、すぐにサンプルコードが見つかるが、当時インターネットは存在していた。ただ、TCP/IP移行前(1981年発行のRFC801でARPANETのプロトコル切り替え完了が1983年1月1日と定められた)である。HTTPやHTML、Gopherもなく、もちろんGoogleさえも存在していない。インターネットにアクセスできたとしても、調べようがなかった。

当時、何かを調べるということは、本を探すことだった。もちろん、事前に書名がわかるはずもなく、存在しない本を探している可能性もあった。最も簡単な方法は、神保町の大きな書店の理工学書売り場に行き、それらしい本を探すことである。ただし、学生だった筆者には、たとえ本を見つけたとしても購入することができるか? という問題もあった。

そういうわけで、自力でなんとか動くモノを作るしか方法がなかった。いきなり機械語は難しいのと、デバッグ、評価が困難になるため、まずは、BASICの整数演算と点を打つルーチンで、正しく動くアルゴリズムを作る。その後、それを機械語で実行できるようにする、という手順を踏んだ。まともに動く機械語のコードを書くのに1週間ぐらいは費やしたと記憶する。

Microsoft BASICだと、BASICインタプリタ内の描画ルーチンや演算ルーチンを呼び出すという手もある。しかし、当時のシャープのBASICは、サブルーチンの前に作業領域を取っていたため、インタプリタが動作中に呼び出すと、作業領域を書き換えてしまう可能性があった。また、そもそもグラフィックス関係のステートメントがなかった。

今では、ちょっと検索すると、簡単にコードが見つかる。たとえば、2点間に線を引きたいのであれば、「ブレゼンハムのアルゴリズム」が見つかる。

線を引くことができれば、それを使って矩形を描画できる。また、同じブレゼンハムのアルゴリズムを使って、円を描画させることも可能だ(写真01)。

  • 写真01: Line、Box、Circleをブレゼンハムのアルゴリズムで実装してみた。出力には、以前紹介したWindowsターミナル・プレビュー版のSixelグラフィックスを使う

以前紹介したSixelグラフィックスと組み合わせたものが、(リスト01)である。このPowerShellプログラムは、単純に点を打ちたい座標と描画色を出力する(写真02)。描画コマンド(Plot-SixelArray)は、3つの整数(X、Y、C)を受け取って、座標(X,Y)に色Cで描画するように作る。実際のプログラムを筆者のGitHubに置いてある。

■リスト01


function Global:Line {
    param(
        [int]$x0,
        [int]$y0,
        [int]$x1,
        [int]$y1,
        [int]$c
    )
    $dx = [math]::Abs($x1 - $x0)
    $dy = [math]::Abs($y1 - $y0)
    $sx=0
    $sy=0
    if($x0 -lt $x1) { $sx=1} else {$sx=-1}
    if($y0 -lt $y1) { $sy=1} else {$sy=-1}
    $err = $dx - $dy
    do{
        Write-Output (,@($x0,$y0,$c))
        if( ($x0 -eq $x1) -and ($y0 -eq $y1)) { break }
        $e2=2 * $err
        if($e2 -gt  -1*$dy) {
            $err -= $dy
            $x0 += $sx
        }
        if($e2 -lt $dx){
            $err += $dx
            $y0 += $sy
        }
    }
    while($true)
}
  • 写真02: ブレゼンハムのアルゴリズムを使うLINE関数(PowerShellで記述)は、プロットする点の座標と色番号をベクトルとして出力する。これをPlot-SixelArray関数で受け、指定された点を打っている

タイトルネタは、ジョン・ヴァーリイ(John Varley)の「へびつかい座ホットライン」(The Ophiuchi Hotline,1977)である。1970年台後半、SFの方向が変わったと感じた。本書や「星を継ぐもの」(J.P.ホーガン。1977年)など、ストーリーの緻密さや表現技法など小説としての完成度が、一段階上がった感じがした。