Project Euler の問題の多くは割り切れる可能性を何度もチェックする必要があるため、ZX81 BASIC でこのタスクを実行する最速の方法を見つけようとしています。
これまで、が割り切れるかどうかを比較(N/D)
しINT(N/D)
てチェックしてきました。私はZ80 マシン コードで
テストを行うことを考えていましたが、マシン コードで BASIC の変数を使用する方法をまだ理解していません。N
D
どうすれば達成できますか?
Project Euler の問題の多くは割り切れる可能性を何度もチェックする必要があるため、ZX81 BASIC でこのタスクを実行する最速の方法を見つけようとしています。
これまで、が割り切れるかどうかを比較(N/D)
しINT(N/D)
てチェックしてきました。私はZ80 マシン コードで
テストを行うことを考えていましたが、マシン コードで BASIC の変数を使用する方法をまだ理解していません。N
D
どうすれば達成できますか?
繰り返し減算することで、機械語でこれを非常に高速に行うことができます。基本的に、次のような手順があります。
set accumulator to N
subtract D
if carry flag is set then it is not divisible
if zero flag is set then it is divisible
otherwise repeat subtraction until one of the above occurs
8 ビット版は次のようになります。
DIVISIBLE_TEST:
LD B,10
LD A,100
DIVISIBLE_TEST_LOOP:
SUB B
JR C, $END_DIVISIBLE_TEST
JR Z, $END_DIVISIBLE_TEST
JR $DIVISIBLE_TEST_LOOP
END_DIVISIBLE_TEST:
LD B,A
LD C,0
RET
これで、USR を使用して基本から呼び出すことができます。USR が返すのは BC レジスタ ペアにあるものなので、おそらく次のようなことをしたいと思うでしょう:
REM poke the memory addresses with the operands to load the registers
POKE X+1, D
POKE X+3, N
LET r = USR X
IF r = 0 THEN GOTO isdivisible
IF r <> 0 THEN GOTO isnotdivisible
これは、私が Z80 について書いた紹介であり、これを理解するのに役立ちます。フラグに慣れていない場合は、これでフラグについて説明します。ZX81 ではなく Spectrum に焦点を当てていますが、メイン サイトからの優れた Z80 へのリンクが他にもたくさんあります。
16 ビット バージョンは非常に似ていますが、レジスタ ペア操作を使用します。16 ビットを超える必要がある場合は、もう少し複雑になります。
これをどのようにロードするかはあなた次第ですが、従来の方法では DATA ステートメントと POKE を使用します。ただし、アセンブラーにマシンコードを理解してもらうことを好むかもしれません!
既存のソリューションで十分な場合があります。プロファイリングのボトルネックであることがわかった場合にのみ、より高速なものに置き換えてください。
(もちろん真顔で言った。)
とにかく、ZX81 では FAST モードに切り替えるだけです。
RANDOMIZE USR が ZX81 で使用できるかどうかはわかりませんが、アセンブリでルーチンを呼び出すために使用できると思います。引数を渡すには、RANDOMIZE USR を実行する前に、POKE を使用していくつかの固定メモリ位置を設定する必要がある場合があります。
ZX Basic をサポートするために ROM に実装されているルーチンのリストを見つけたことを覚えています。フローティング操作を行うものはいくつかあると思います。
浮動小数点に代わる方法は、固定小数点演算を使用することです。数学コプロセッサがないこのような状況では、はるかに高速です。
詳細については、Sinclair User issues を参照してください。彼らは、ZX Spectrum でプログラミングに関連するいくつかの記事を公開しました。
最初に、いくつかの既知のメモリ位置に値を配置する必要があります。次に、Z80 アセンブラー内の同じ場所を使用します。2 つの間でパラメーターの受け渡しはありません。
これは、私が(まだ)覚えている ZX Spectrum 48 に基づいています。幸運を祈りますが、ハードウェアのアップグレードを検討してください。;/
Z80 マシン コードの問題は、浮動小数点演算がないことです (さらに言えば、整数の除算や乗算もありません)。Z80 アセンブラで独自の FP ライブラリを実装するのは簡単ではありません。もちろん、組み込みの BASIC ルーチンを使用することもできますが、BASIC を使い続けることもできます。