考え方を学ぶ
2025.02.21
プログラムの組み方も人それぞれの考え方が反映されます。
組織の中では、属人的ではない方が望ましいかもしれませんけど。(作った人がいなくなったら保守できない・・・では困る)
お手本や周囲の仲間からの学んだことが基本になっていると思います。
Z80を覚えたのは高校生の頃、同じクラスの友人に教わりながらマシン語でプログラムを作っていました。
結果がわかりやすいのは画面表示の操作です。見てわかります。
たとえば白黒反転(MZ-2000だから緑白か)してみるとか。逆さまにするとか。鏡像にするにはどんなふうにプログラムを作るか。
画面の一部を切り抜いて、指定した位置へ移動させるには。
スクロール(タテ、ヨコ)をするには。
最初はループの作り方も知らなかったのですが、試しながら徐々に覚えていきました。
自分なりに考えて、画像を裏返し(鏡像)にしてみようと思い付きました。
それには1バイトごとにビットをひっくり返す必要があります。
最初に考えたルーチンは恥ずかしくて見せられたもんじゃありません。
BIT命令、SET命令、RES命令を使って、ビット0が0だったら結果レジスタのビット7を0にする。1だったら1にする。こんなふうに8ビット分、くそまじめに記述しました。
でも・・・よく考えてみると、結果を入れるレジスタを最初にクリアしておけば、0は書かなくて良いのです。1だけ見て処理すれば良いことに気づき、プログラムは短くなりました。
もう、これ以上考えることはない。自分なりに考えても、これ以上シンプルにはできないはずだ。
ところが友人は、シフト命令を使ってキャリーフラグ経由で1ビットずつ移すプログラムを作りました。まさに目から鱗でした。
私は、そういう使い方を思いつかなかったからです。命令表でキャリーフラグを巻き込んでシフトする命令があるのはたぶん知っていたはずです。でも、使い方(応用)を思いつかなかった。
コピー元のレジスタを左にシフト、最上位のビットがキャリーに入る。これをコピー先のレジスタにキャリーから入れて右にシフトする。この処理を8回繰り返せば1バイトの処理が済む。
でも、世の中にはもっと他の考え方もありました。
あらかじめ、反転データのテーブルを作っておくのです。あるいは、初期化時にRAM上へ展開するのでも良いでしょう。
こうすればアドレスの計算だけで速く変換できます。その代わりメモリを食います。
さらに考えると(考えるまでもないが)そのテーブルを、きりの良いアドレスに配置すればアドレスの計算も簡単かつ速くなるわけです。
これ以上は有るかと言うと、プログラムでやれる方法は思いつきませんが、ハードウェアを使ってよいのなら特定のアドレスなりポートに書くと(配線がクロスしていて)別のアドレスかポートから反転データが得られる、というのは可能です。(あくまでも、CPUにそういう命令がない場合の話です)
組織の中では、属人的ではない方が望ましいかもしれませんけど。(作った人がいなくなったら保守できない・・・では困る)
お手本や周囲の仲間からの学んだことが基本になっていると思います。
Z80を覚えたのは高校生の頃、同じクラスの友人に教わりながらマシン語でプログラムを作っていました。
結果がわかりやすいのは画面表示の操作です。見てわかります。
たとえば白黒反転(MZ-2000だから緑白か)してみるとか。逆さまにするとか。鏡像にするにはどんなふうにプログラムを作るか。
画面の一部を切り抜いて、指定した位置へ移動させるには。
スクロール(タテ、ヨコ)をするには。
最初はループの作り方も知らなかったのですが、試しながら徐々に覚えていきました。
自分なりに考えて、画像を裏返し(鏡像)にしてみようと思い付きました。
それには1バイトごとにビットをひっくり返す必要があります。
最初に考えたルーチンは恥ずかしくて見せられたもんじゃありません。
BIT命令、SET命令、RES命令を使って、ビット0が0だったら結果レジスタのビット7を0にする。1だったら1にする。こんなふうに8ビット分、くそまじめに記述しました。
でも・・・よく考えてみると、結果を入れるレジスタを最初にクリアしておけば、0は書かなくて良いのです。1だけ見て処理すれば良いことに気づき、プログラムは短くなりました。
もう、これ以上考えることはない。自分なりに考えても、これ以上シンプルにはできないはずだ。
ところが友人は、シフト命令を使ってキャリーフラグ経由で1ビットずつ移すプログラムを作りました。まさに目から鱗でした。
私は、そういう使い方を思いつかなかったからです。命令表でキャリーフラグを巻き込んでシフトする命令があるのはたぶん知っていたはずです。でも、使い方(応用)を思いつかなかった。
コピー元のレジスタを左にシフト、最上位のビットがキャリーに入る。これをコピー先のレジスタにキャリーから入れて右にシフトする。この処理を8回繰り返せば1バイトの処理が済む。
でも、世の中にはもっと他の考え方もありました。
あらかじめ、反転データのテーブルを作っておくのです。あるいは、初期化時にRAM上へ展開するのでも良いでしょう。
こうすればアドレスの計算だけで速く変換できます。その代わりメモリを食います。
さらに考えると(考えるまでもないが)そのテーブルを、きりの良いアドレスに配置すればアドレスの計算も簡単かつ速くなるわけです。
これ以上は有るかと言うと、プログラムでやれる方法は思いつきませんが、ハードウェアを使ってよいのなら特定のアドレスなりポートに書くと(配線がクロスしていて)別のアドレスかポートから反転データが得られる、というのは可能です。(あくまでも、CPUにそういう命令がない場合の話です)
トラックバックURL
トラックバック一覧
コメント一覧
コメント投稿