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