해결책
무작위 화를 ZX81에서 사용할 수 있는지 모르지만 조립품에서 루틴을 호출하는 데 사용할 수 있다고 생각합니다. 인수를 전달하려면 무작위 화를 실행하기 전에 고정 메모리 위치를 설정하려면 Poke를 사용해야 할 수도 있습니다.
ZX Basic을 지원하기 위해 ROM에서 구현 된 루틴 목록을 찾아야합니다. 떠 다니는 작업을 수행 할 몇 가지가 있다고 확신합니다.
부동 소수점의 대안은 고정 점 수학을 사용하는 것입니다. 수학 공동 프로세서가없는 이러한 상황에서는 훨씬 빠릅니다.
Sinclair 사용자 문제에서 더 많은 정보를 찾을 수도 있습니다. 그들은 ZX 스펙트럼에서 프로그래밍과 관련된 몇 가지 기사를 게시했습니다.
다른 팁
반복적으로 빼서 기계 코드 에서이 작업을 매우 빠르게 수행 할 수 있습니다. 기본적으로 다음과 같은 절차가 있습니다.
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을 사용하여 BASIC에서 전화 할 수 있습니다. 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 초점이 아닌 스펙트럼이지만 기본 사이트에서 좋은 Z80 물건에 대한 더 많은 링크가 있습니다.
16 비트 버전은 상당히 비슷하지만 레지스터 쌍 작업을 사용합니다. 16 비트를 넘어야한다면 조금 더 복잡해질 것입니다.
당신이 이것을로드하는 방법은 당신에게 달려 있습니다. 그러나 전통적인 방법은 데이터 진술과 찌르기를 사용하는 것입니다. 그래도 어셈블러가 당신을위한 기계 코드를 알아내는 것을 선호 할 수도 있습니다!
기존 솔루션이 충분할 수 있습니다. 프로파일 링의 병목 현상이라고 생각하면 더 빠른 것으로 대체하십시오.
(물론 똑 바른 얼굴로 말했다.)
어쨌든 ZX81에서는 빠른 모드로 전환 할 수 있습니다.
먼저 미리 알려진 메모리 위치에 값을 배치해야합니다. 그런 다음 Z80 어셈블러 내에서 동일한 위치를 사용하십시오. 둘 사이에 전달되는 매개 변수는 없습니다.
이것은 내가 (여전히) ZX Spectrum 48에 대한 기억을 기반으로합니다. 행운을 빕니다. 그러나 HW 업그레이드를 고려할 수 있습니다. ;/
Z80 머신 코드의 문제점은 플로팅 포인트 OPS가 없다는 것입니다 (그리고 그 문제에 대해 정수 분할 또는 곱하기는 없음). Z80 어셈블러에서 자신의 FP 라이브러리를 구현하는 것은 사소한 일이 아닙니다. 물론 내장 된 기본 루틴을 사용할 수 있지만 기본을 고수 할 수도 있습니다.