Frage

Da viele der Projekt Euler Probleme, die Sie benötigen eine Teilbarkeitsprüfung für eine ganze Reihe von Zeiten zu tun, ich habe versucht, den schnellsten Weg, um herauszufinden, um diese Aufgabe auszuführen in ZX81 BASIC.

Bisher habe ich (N/D) im Vergleich zu INT(N/D) zu überprüfen, ob N von D teilbaren ist oder nicht.
Ich habe in Z80 Maschinencode zu tun den Test zu denken, habe ich noch nicht herausgefunden, wie die Variablen in dem Maschinencode in der BASIC verwenden.

Wie kann es erreicht werden?

War es hilfreich?

Lösung

Sie wissen nicht, ob RANDOMIZE USR in ZX81 vorhanden ist, aber ich denke, es kann verwendet werden Routinen in der Montage zu nennen. Um Argumente übergeben müssen Sie möglicherweise POKE verwenden, um einige feste Speicherplätze zu setzen, bevor RANDOMIZE USR ausgeführt wird.

Ich erinnere mich an eine Liste von Routinen im ROM implementiert zu finden, um die ZX Basis zu unterstützen. Ich bin sicher, es gibt ein paar, um Floating-Vorgang durchführen.

Ein alternativer Punkt zu floating ist Fixpunkt math zu verwenden. Es ist viel schneller in dieser Art von Situationen, in denen es kein mathematischen Coprozessor.

Sie können auch weitere Informationen in Sinclair Benutzerfragen finden. Sie veröffentlichte einige Artikel im Zusammenhang mit der Programmierung in der ZX Spectrum

Andere Tipps

Sie können dies sehr schnell in Maschinencode durch wiederholtes Subtrahieren. Grundsätzlich haben Sie eine Prozedur wie:

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

Die 8-Bit-Version wäre so etwas wie:

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

Nun können Sie von einfach mit USR nennen. Welche USR Renditen unabhängig von den im BC-Registerpaar, so dass Sie wahrscheinlich so etwas wie tun möchten:

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

Dies ist eine Einführung I Z80 schrieb, die helfen sollten Sie dies herauszufinden. Dies wird erklären die Flaggen, wenn Sie nicht mit ihnen vertraut sind. Es gibt eine Last mehr Links zu guten Z80 Sachen aus der Haupt-Website, obwohl es Spectrum ist eher als ZX81 fokussierte.

Eine 16-Bit-Version wäre ziemlich ähnlich, aber Registerpaar Operationen. Wenn Sie über 16 Bits gehen müssen, es wäre ein etwas gewunden erhalten.

Wie Sie diese laden ist bis zu Ihnen - aber die traditionelle Methode ist die Verwendung DATA-Anweisungen und POKEs. Sie bevorzugen wenn Sie einen Assembler Figur aus dem Maschinencode haben!

Ihre bestehende Lösung kann gut genug sein. Nur ersetzt ihn durch etwas schneller, wenn Sie es finden, ein Engpass in Profilierung zu sein.

(sagte mit ernstem Gesicht, natürlich.)

Und überhaupt, auf dem ZX81 können Sie nur auf FAST-Modus wechseln.

Sie sollten die Werte in einigen vorbekannte Speicherplätze, erster Platz. Dann nutzen Sie die gleichen Stellen innerhalb Z80-Assembler. Es gibt keine Parameter zwischen den beiden vorbei.

Dieses basiert auf, was ich (noch) erinnern, der ZX Spectrum 48. Viel Glück, aber Sie könnten Ihre hw betrachten aktualisieren. ; /

Das Problem bei Maschinencode Z80 ist, dass es keine Gleitkomma- ops hat (und keine ganze Zahl divide oder mehrfach, was das betrifft). Umsetzung Ihrer eigenen FP-Bibliothek in Z80-Assembler ist nicht trivial. Natürlich können Sie die eingebauten BASIC-Routinen verwenden, aber dann können Sie auch nur mit BASIC bleiben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top