乗算って、例えばA×Bってのは、AをB回足したのと同じだから、単純に掛ける数の回数で掛けられる数を加算すると、これで答えが出てしまうんです。簡単ですよね。
最も原始的な乗算
ただ、この処理系だと最大で256回ループしてしまうので、それを何とか減らしたいワケです。今回はこの乗算について検討してみたいと思います。

例えば 56×19 という乗算を考えます。昔の算数の考え方では、下の桁を合わせて、各桁毎に掛けていきました。計算式に直してみます。

9 * 6 + 9 * 50 + 10 * 6 + 10 * 50 = 1064

ここで注目したいのが50とか10という部分です。これ、無意識に10進数で分解してますよね。元の数値が10進数だから、自然とそう計算しているわけです。では、これを2進数で表すとどうなるでしょうか。

56 = %00111000 19 = %00010011

乗算においてゼロは掛けてもゼロのままですから、意味がないのですっ飛ばすと…

%00111000 * %1 + %00111000 * %10 + %00111000 * %10000 = %0000100_00101000 = 1064

ところで、乗算は掛ける数と掛けられる数に、それぞれ同じ数を掛けて割ると結果が変わらないという特性があります。例えば、12 * 8 = 24 * 4 = 48 * 2 = 96 * 1 = 96 とそれぞれ 2倍と1/2をしていった結果、片側の数が 1 になって答えに辿り着いたりします。

この考え方で、2進数の値を見ていきます。2進数の掛け算は2倍が基本です。左シフト1回で2倍となります。右シフトだと1/2になります。例えば、%00111000 * %10(56 * 2 の2進数表現)は、単純に2倍なので %01110000 となります。掛け算部分をシフトしてみると…

%00000000_00111000 + %00000000_01110000 + %00000011_10000000 = %0000100_00101000 = 1064

ここで既に気が付いた人もおられるかも。掛ける数を1/2したら、掛けられる数を2倍して、bitが立っていたら、その時の掛けられる数を加算していけば同じことになります。この考え方を Z80 のコードに落とし込むと、次のようになります。
2進数の桁上りを考慮した乗算
8bitの計算ですから、8回ループしてるサンプルもよく見ますが、bitが無くなった時点で計算不要ですから、さっさとループから終了してしまえば良いと思うのです。簡単なサブルーチンですが、アセンブラでの掛け算の考え方についての説明でした。皆様の参考になれば幸いです。
Amazonベーシック 5段スチールラック 棚 メタルラック 耐荷重794kg 幅91×奥行36×高さ183cm ブラック
これはとても安いのに耐荷重がかなりあって使いやすそうなスチールラックです。似たようなライバル製品はだいたい2倍近い値段になっているので、この手のラックを探しているのなら、これはお買い得ですね。