Install serial:
pip install pyserial
Run the script:
python vax_mem_full.py
Script:
import serial
import time
import re
# Increase timeout and use a slightly slower baud rate if 9600 is flaky,
# but 9600 is usually standard.
ser = serial.Serial('/dev/ttyS0', 9600, timeout=1)
def vax_io(cmd):
# 1. Clear the buffer so we don't read old garbage
ser.reset_input_buffer()
# 2. Send the command with a Carriage Return
ser.write(f"{cmd}\r".encode())
# 3. Wait for the VAX to finish. We look for the '>>>' prompt.
timeout = time.time() + 2 # 2 second safety timeout
full_resp = ""
while ">>>" not in full_resp:
if ser.in_waiting > 0:
full_resp += ser.read(ser.in_waiting).decode(errors='ignore')
if time.time() > timeout:
break
time.sleep(0.05)
return full_resp
def test_onboard_full_map():
start = 0x00300000
end = 0x003FFFFF
error_count = 0
print(f"--- Mapping Entire Onboard RAM (4MB) ---")
# We'll use a slightly larger step (e.g., 1KB) if you want a fast map,
# or keep it at 4 to check every single longword.
for addr in range(start, end, 4):
addr_hex = f"{addr:08X}"
# Test pattern: All zeros then all ones
for pat in [0x00000000, 0xFFFFFFFF, 0xAAAAAAAA, 0x55555555]:
pat_hex = f"{pat:08X}"
vax_io(f"D /L /P /U {addr_hex} {pat_hex}")
resp = vax_io(f"E /L /P /U {addr_hex}")
match = re.search(r"P\s+[0-9A-F]+\s+([0-9A-F]+)", resp, re.IGNORECASE)
if match:
received_val = match.group(1).upper()
if received_val != pat_hex:
error_count += 1
print(f"\n[!] ERROR at {addr_hex}")
print(f" Expected: {pat_hex} | Recv: {received_val}")
# If we get too many errors, the board might be totally dead
if error_count > 100:
print("\n[!!!] Too many errors! Likely a controller or bus failure.")
return
if addr % 0x1000 == 0:
print(f"Mapping... {addr_hex} (Errors found: {error_count})", end='\r')
print(f"\nScan Complete. Total errors logged: {error_count}")
# Clear the screen on the VAX first
vax_io("\r")
test_onboard_full_map()