Pergunta

Uma vez que muitos dos problemas de projeto Euler exigem que você faça uma verificação de divisibilidade por um bom número de vezes, eu estive tentando descobrir a maneira mais rápida para executar esta tarefa em ZX81 BASIC.

(N/D) Até agora eu em comparação com INT(N/D) para verificar, se N é divisível por D ou não.
Eu estive pensando em fazer o teste em Z80 código de máquina , eu ainda não têm descobriu como usar as variáveis ??do BASIC no código de máquina.

Como ela pode ser alcançada?

Foi útil?

Solução

Não sei se RANDOMIZE USR está disponível no ZX81, mas acho que pode ser usado para chamar rotinas na montagem. Para passar argumentos que você pode precisar usar POKE para definir algumas posições de memória fixos antes de executar RANDOMIZE USR.

Lembro-me para encontrar uma lista de rotinas implementadas na ROM para apoiar o ZX Basic. Estou certo de que há alguns para executar a operação flutuante.

Uma alternativa para ponto flutuante é usar matemática de ponto fixo. É muito mais rápido neste tipo de situações em que não há co-processador matemático.

Você também pode encontrar mais informações em questões de Usuários Sinclair. Eles publicaram alguns artigos relacionados com a programação no ZX Spectrum

Outras dicas

Você pode fazer isso muito rápido em código de máquina subtraindo repetidamente. Basicamente, você tem um procedimento como:

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

A versão de 8 bits seria algo como:

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

Agora, você pode chamar a partir básico usando USR. O que USR retornos é tudo o que está no par BC registo, assim que você provavelmente vai querer fazer algo como:

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

Esta é uma introdução que escreveu para Z80 que deve ajudá-lo a descobrir isso. Esta vontade explicar as bandeiras se você não estiver familiarizado com eles. Há uma carga mais links para boa Z80 material do site principal, embora seja Spectrum em vez de ZX81 focado.

A versão de 16 bits seria muito semelhante, mas usando operações de registo par. Se você precisa ir além de 16 bits que iria ficar um pouco mais complicado.

Como você carregar este é com você - mas o método tradicional é usar declarações de dados e pica. Você pode preferir ter uma figura assembler o código de máquina para você embora!

A sua solução existente pode ser bom o suficiente. Apenas substituí-lo por algo mais rápido se você encontrá-lo para ser um gargalo em perfis.

(dito com uma cara recta, é claro.)

E de qualquer maneira, no ZX81 você pode simplesmente mudar para o modo rápido.

Você deve colocar os valores em algumas posições de memória pré-conhecido, em primeiro lugar. Em seguida, use os mesmos locais de dentro Z80 assembler. Não há passagem de parâmetros entre os dois.

Esta é baseada no que eu (ainda) se lembrar de ZX Spectrum 48. Boa sorte, mas você pode considerar atualizar seu hw. ; /

O problema com o código de máquina Z80 é que ele não tem ops flutuantes pontuais (e sem divisão de número inteiro ou multiplicar, para esse efeito). Implementar a sua própria biblioteca FP no Z80 assembler não é trivial. Claro, você pode usar o built-in rotinas básicas, mas então você pode muito bem ficar com BASIC.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top