贅沢しちゃダメ、贅沢しちゃダメ

 インターネット黎明のころ、パソコン通信のBBSへの書き込みした方からその当時どんな雰囲気だったかを聞きます。

hard(265/457) 93/09/20 00:14 あら?
<258:もう、慣れてしまいました。>
510B
〇〇〇〇さんはZ80から68Kにうつったんですよね?
私なんかは最初のころ「遅いロングワードよりはやいワード」とか
「なんでバイト演算がワード演算と速さがいっしょなんや(バイトの方が速いと思ってる)」
 なんておもってましたけれども.....
 いや、しかし、68Kでも「レジスタが少なくて苦労する」「シフトがつらい(ADDでやってしまう)」
 なんてことにすぐなると思います。ああ、贅沢は贅沢をよぶ。

贅沢しちゃダメ、贅沢しちゃダメ ああ~ 今月は贅沢命令が使えるやろか

1993/9 BBSの書き込み より

 Motorola 68000 MCUでのアセンブラプログラミングへのリプライのようです。Zilog Z80 CPUの8ビットパソコンからX68000へ移行した方は、8ビットプロセッサから16ビットプロセッサという違い以上に慣れが必要だったみたいです。贅沢とはどういう事なのでしょう。

 リプライ先の方にZ80から68000にうつったんですよね?と書きつつ、自身もSharpのZ80 CPUを使うパソコン X1から、Sharpの68000 MCUを使うX68000へと使うパソコンを移り変わっている。書き込みは、ちょうど少し大きめのアセンブラのソフトウェアも経験した後、68000アセンブラなにもわからないって状態から、チョットデキルなんて思いかけていたころ。
 ZilogのZ80は8ビットプロセッサ、Motorolaの68000は16ビットプロセッサ。Z80は内蔵されている計算ユニットが8ビットのため、8ビット演算はそれなりに、16ビット演算は8ビット演算の複数回実行で行われるため、かなり遅くなる。こういった性質のCPUを使いつづけて貧乏性を発揮すると、いろいろな演算はなるべく8ビットで収まるようにしておいて、必要な時だけ16ビット演算をするという癖がついていく。そんな癖がついた後での移行だったから

「なんでバイト演算(8ビット演算)がワード演算(16ビット演算)と速さがいっしょなんや」

という、本末転倒な文句を書いてしまう成れ果てとなる。このような勘違い貧乏性ともいえる悪癖はずっとひきずったままなので、生来のもののよう。
 書き込みに対して熟練プログラマーから当時リプライされた事を要約すると以下の通り

「命令に不備を感じる間は、まだモトローラの真理を理解せずにZ8的にCPUを使っている証拠です~、と、しつこく言っているのに。
 68000の命令クロックのEAtと実行tの値を良く見れば、おのずと意味が・・・
 副産物として、実行クロックが暗記できて嬉しいし(嬉しくないって?)
 レジスタが少なくて苦労するのは、完全に理解の方向を誤った結果です~
 いまならまだ間に合うかもしれないけど、間に合わないかもしれない。
 おおおおお・・・かわいそうにぃ、そんなになって、もうおしまい。
 あーあ、おわってもた。あーあ。だめ。
 だめです。
 じ・えんど。
 キャッシュのゴミ。 ぷぅぅううう~
 今月も贅沢命令が使える。MULS、DIVSも普通にバンバン使いまくれるし、全部16bitオフセット・メモリアクセスでもV-SYNCを割らないのは、やはりモトローラの神の啓示を素直に受け止めた結果でありましょう。
 不心得モノは速度に出るのです」

 上には上がいるのだ。チョットデキルなんて思うと既に何本もアセンブラでソフトウェアを世に送り出している方からフルスイングでダメ出しされる。
 「~でもV-SYNCを割らない」って書かれてるあたりにゲームプログラマ仕草あり。その頃スプライトを使用するゲームは基本的に画面更新1回分の処理がV-SYNC割り込み1回(約1/60秒 16.6ms)をこえないようにプログラムを作成するため、このような表現がとなる。X68000でスプライトを使用するゲームを作る場合、このような考え方はよく見かけるものだった。
 「レジスタが少なくて苦労するのは完全に理解の方向を誤っている」という内容を本当の意味で理解するのは書き込みから何年もずっと後の事になる。熟練プログラマーは当時すでにデータと機能をまとめたオブジェクト指向のようなプログラミングをアセンブラでしており、機能に対してメモリブロックを割り当てて、メモリブロック先頭をアドレスレジスタに入れて呼び出ししつつアドレスレジスタ間接の「全部16bitオフセット・メモリアクセス」操作するようにしていた。機能に割り当てられているメモリブロックは他の機能のプログラムから変更しないという事を徹底しており、きわめてバグの入り込みにくいプログラムを68000アセンブラで記述していた。
 作り方の違いがわからないまま、指摘にあった「全部16bitオフセット・メモリアクセス」を頻繁に使うプログラムをみると、どうしてサブルーチンに飛ぶ時にアドレスレジスタにメモリブロックの頭を入れるのか、どうしてサブルーチン内でインデックス付きアドレスレジスタ間接のような遅い命令を高頻度で使うのか、どうして最初にレジスタに必要な値をロードしてレジスタで全ての演算をしないのか。なぜ遅くなるようなプログラムの組み方をしているのかわからなかった。そんなプログラムの仕方だから、レジスタが少なくて苦労するとかBBSに書き込んでしまう。
 いまになって考えれば、速度が必要な部分というのはループ回数のきわめて多い場所等のごく一部であり、大半のプログラムはバグが少なく、堅牢で、修正しやすく、可読性が高い事が大切である事、命令単位での速度はどうしても高速化しないといけない部分でだけ集中して確認すれば良く、熟練プログラマーのやっていたインデックス用のオフセットを名前定義してインデックス付きアドレスレジスタ間接を多用するのは可読性をあげつつ、管理している以外の他の領域を不用意に参照・書き込みしないためというのがわかる。しつこく指摘してもらえていたにもかかわらず68000プロセッサの真理を理解していなかったのだ。書き込みをみると、どれだけ「不心得モノ」だったのかがわかり心に刺さる。

BBS書き込みした方による現在のコメント

 アセンブラの命令自体で贅沢かどうかという事なら、C言語などの高級言語で記述したりするのはどうなってしまうのか心配になってしまうような印象です。書き込みをした方はアセンブラで書ききる事はどちらかというと苦手だそうで、書き込みをしたころは速度の不要な部分はC言語で、どうしても高速化しないといけない部分はアセンブラで、と使い分けていたそうです。そんな姿勢を周りの方から68000のアセンブラは高級言語みたいなものなのにとか、C言語なんて処理を変更してコンパイルした時にどんなバグを生み出すかわからないものをツールならまだしも成果物で使うのはありえないとか、いろいろ言われて肩身が狭かったそうです。当時の特定機種向けCコンパイラは最適化がそれほどできるわけでもなく、コンパイル時にバグを混入させるものもあったりで、どういった記述であれば問題が発生しにくいかという勘所をつかんで使うようなところもあって、かなり状況が違うようです。現在では最適化も高度になり、バグも極めて少ないコンパイラが提供され、高級言語を安心して使用できることが多くなっています。

用語

・贅沢しちゃダメ
 テレビコマーシャルのフレーズ。節約トムというネズミが「贅沢しちゃだめ、贅沢しちゃだめ。今月はぜいたくスコーンが食べれるだろうか?ねがいましては光熱費15円、交際費23円。ああ~贅沢しちゃだめ、贅沢しちゃだめ。いつかは食べたい、ぜいたくスコーン」とソロバンはじく姿と、ぜいたくスコーンのビジュアルにより一度みると強い印象を残す🐭

・Zilog Z80 CPU
 ザイログ社によって設計された8ビットマイクロプロセッサ。レジスタ数はある程度あるものの、色々な演算を行うことが出来るのは特定のレジスタだけで、その特徴を理解してプログラムする必要がある。CPUから常時見える8ビットの汎用レジスタはA、B、C、D、E、H、L、16ビットのレジスタはIX、IY。
 A’などのダッシュ付きのレジスタはレジスタ交換命令によりA~Lのセットがもう一組のセットと入れ替わる仕組み。

Zilog Z80 Microprocessors Z80 CPU User Manual https://www.zilog.com/docs/z80/um0080.pdf P16 Figure 2. CPU Register Configurationより

・Motorola 68000 MCU
 モトローラ社によって設計された16ビットマイクロプロセッサ。汎用的に演算に使用できるデータレジスタ D0~D7を8個、色々なアドレッシングを使えるメモリアクセス用のアドレスレジスタ A0~A7を8個持つ。これらのレジスタすべて32ビットレジスタで構成されており、8ビットで行う演算と16ビットで行う演算のスピードは基本的に同じ。32ビットでの演算の場合に16ビットより多くのサイクルがかかり若干遅くなる。
 68000にアセンブラにおいて、8ビットはバイト、16ビットはワード、32ビットはロングワードと記述する。

NXP M68000 8-/16-/32-Bit Microprocessors User’s Manual Ninth Edition https://www.nxp.com/docs/en/reference-manual/MC68000UM.pdf P16 Figure 2-1より

・MULS、DIVS
 68000 MCUの16ビット符号付整数乗算命令と16ビット符号付除算命令の名称。8ビットのプロセッサでは乗除算命令が無い事が多く、加減算命令などを組み合わせる事により乗除算を計算するしかないが、16ビットのプロセッサでは乗除算命令により1命令で計算できる事が多い。68000 MCUでは16ビット×16ビット→32ビットと、32ビット÷16ビット→16ビット、剰余16ビットの符号付整数および符号無し整数の演算が1命令で計算可能。贅沢命令。

インターネット黎明のころの草の根BBSももりこみつつ、いろんなエピソードをつめこんだ「ちょっと偏ったインターネット老人会へようこそ」を同人誌として頒布予定です。
参加予定イベント
 11月6日 おもしろ同人誌バザール@神保町2022秋
 11月20日 第七回技術書同人誌博覧会

同人サークル BLACK FTZやってます twitter @black_ftz 


この記事が気に入ったらサポートをしてみませんか?