質問

プロジェクトオイラーの問題の多くは、何度も分割可能性チェックを行う必要があるため、 ZX81 BASIC。

これまで(N / D) INT(N / D)を比較して、 N D かどうか。
Z80マシンコードでテストを行うことを考えていますが、まだ行っていませんマシンコードでBASICの変数を使用する方法を見つけました。

どのように達成できますか?

役に立ちましたか?

解決

ZX81でRANDOMIZE USRを使用できるかどうかはわかりませんが、アセンブリでルーチンを呼び出すために使用できると思います。引数を渡すには、RANDOMIZE USRを実行する前に、POKEを使用していくつかの固定メモリ位置を設定する必要がある場合があります。

ZX BasicをサポートするためにROMに実装されているルーチンのリストを忘れずに見つけました。フローティング操作を実行するものがいくつかあると確信しています。

浮動小数点に代わる方法は、固定小数点演算を使用することです。数学コプロセッサがないこのような状況では、はるかに高速です。

Sinclairユーザーの問題で詳細を確認することもできます。 ZX Spectrumでのプログラミングに関連する記事をいくつか公開しました

他のヒント

繰り返し減算することにより、マシンコードで非常に高速にこれを行うことができます。基本的に次のような手順があります:

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モードに切り替えることができます。

最初に、いくつかの既知のメモリ位置に値を配置する必要があります。次に、Z80アセンブラー内から同じ場所を使用します。 2つの間でパラメータを渡すことはありません。

これは、ZX Spectrum 48の(まだ)記憶に基づいています。幸運なことに、ハードウェアのアップグレードを検討してください。 ; /

Z80マシンコードの問題は、浮動小数点演算がないことです(そのため、整数の除算または乗算もありません)。 Z80アセンブラで独自のFPライブラリを実装するのは簡単ではありません。もちろん、組み込みのBASICルーチンを使用できますが、BASICだけを使用することもできます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top