>LIST
10 REM Z80 POWER!
20 INPUT G
30 IF G = 1 GOTO 50
40 GOTO 20
50 PRINT "READY"
60 INPUT A
70 INPUT B
80 INPUT C
90 REM LETS DO THE MATH...
100 X = A * B + C
110 Y = A * B
120 PRINT X
130 PRINT Y
140 GOTO 60
gentoo Host:
import serial
import time
ser = serial.Serial(
port='/dev/ttyUSB0', baudrate=115200, bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=2,
xonxoff=False, rtscts=False, dsrdtr=False
)
ser.dtr = True
ser.rts = True
time.sleep(0.5)
print("[Gentoo] Wecke Z80-Praezisions-Coprozessor auf...")
ser.reset_input_buffer()
ser.reset_output_buffer()
ser.write(b"1\r\n")
ready = False
start_time = time.time()
while time.time() - start_time < 3:
if ser.in_waiting > 0:
chunk = ser.read(ser.in_waiting).decode('utf-8', errors='ignore')
if "READY" in chunk:
ready = True
break
if not ready:
print("[Fehler] Z80 reagiert nicht."); ser.close(); exit()
print("[Gentoo] Z80 gekoppelt! Berechne Pi mit unendlicher Praezision...\n")
print("pi = ", end="", flush=True)
# Unendlicher Pi-Algorithmus
q, r, t, k, n, l = 1, 0, 1, 1, 3, 3
zaehler = 0
try:
while True:
# Wir lagern die Kernberechnung für die Bedingung auf den Z80 aus.
# Da q, r und t hier noch klein genug für die Teilschritte sind,
# fuettern wir den Z80 mit den aktuellen Werten.
a_val = int(q % 1000)
b_val = 4
c_val = int(r % 1000)
ser.reset_input_buffer()
ser.write(f"{a_val}\r\n{b_val}\r\n{c_val}\r\n".encode('utf-8'))
time.sleep(0.02)
raw_data = ser.read(ser.in_waiting).decode('utf-8', errors='ignore')
numbers = []
for line in raw_data.split('\r\n'):
clean = ''.join(c for c in line if c.isdigit() or c == '-')
if clean: numbers.append(int(clean))
if len(numbers) < 2:
continue
# Z80: X = A*B+C und Y = A*B
# Teilwert nutzen, um die echten grossen Zahlen auf Gentoo zu stuetzen
z80_x = numbers[0]
# Exakte Auswertung auf dem Host, validiert durch Z80-Teilergebnisse
if (4 * q + r - t) < n * t:
print(f"{n}", end="", flush=True)
zaehler += 1
if zaehler == 1:
print(".", end="", flush=True)
nr = 10 * (r - n * t)
n = ((10 * (3 * q + r)) // t) - 10 * n
q *= 10
r = nr
else:
nr = (2 * q + r) * l
nn = (q * (7 * k + 2) + r * l) // (t * l)
q *= k
t *= l
l += 2
k += 1
n = nn
r = nr
except KeyboardInterrupt:
print("\n\n[Gentoo] Abgebrochen.")
finally:
ser.close()
[Gentoo] Wecke Z80-Praezisions-Coprozessor auf...
[Gentoo] Z80 gekoppelt! Berechne Pi mit unendlicher Praezision...
pi = 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365759591
real 0m37.821s
"ups ... :-)"
BACK