From b722280c5ac1b21f0960b069828be5629518085d Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Thu, 11 Jun 2020 00:24:27 -0400 Subject: [PATCH] First version of VEServer - alternative server for ADT's VEDRIVE.SYSTEM. --- veserver.py | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100755 veserver.py diff --git a/veserver.py b/veserver.py new file mode 100755 index 0000000..0cc1564 --- /dev/null +++ b/veserver.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python3 + +# +# Bobbi 2020 +# +# Alternative server for ADTPro's VEDRIVE.SYSTEM +# Virtual Ethernet Drive for Apple II / ProDOS +# +# See https://www.adtpro.com/protocolv1.html +# + +import socket + +IP = "::" +PORT = 6502 +FILE1 = "virtual-1.po" +FILE2 = "virtual-2.po" +BLKSZ = 512 + +packet = 1 + +# Append byte b to list l +# Return updated checksum +def appendbyte(l, b, csin): + l.append(b) + return csin ^ b + +# +# Read block with date/time update +# +def read3(sock, addr, drive, d): + global packet + l = [] + appendbyte(l, packet & 0xff, 0) # Packet number + packet += 1 + cs = appendbyte(l, 0xc5, 0) # "E" + cs = appendbyte(l, d[1], cs) # 0x03 or 0x05 + cs = appendbyte(l, d[2], cs) # Block num LSB + cs = appendbyte(l, d[3], cs) # Block num MSB + cs = appendbyte(l, 0, cs) # TODO: Date/time + cs = appendbyte(l, 0, cs) # TODO: Date/time + cs = appendbyte(l, 0, cs) # TODO: Date/time + cs = appendbyte(l, 0, cs) # TODO: Date/time + appendbyte(l, cs, cs) # Checksum + + blknum = d[2] + 256 * d[3] + print('R{0:05d} '.format(blknum), end='', flush=True) + b = blknum * BLKSZ + if d[1] == 0x03: + file = FILE1 + else: + file = FILE2 + with open(file, 'rb') as f: + f.seek(b) + block = f.read(BLKSZ) + + cs = 0 + for i in range (0, BLKSZ): + cs = appendbyte(l, block[i], cs) + appendbyte(l, cs, cs) + + b = sock.sendto(bytearray(l), addr) + #print('Sent {} bytes to {}'.format(b, addr)) + +# +# Write block +# +def write(sock, addr, drive, d): + global packet + l = [] + appendbyte(l, packet & 0xff, 0) # Packet number + packet += 1 + cs = appendbyte(l, 0xc5, 0) # "E" + cs = appendbyte(l, d[1], cs) # 0x02 or 0x04 + cs = appendbyte(l, d[2], cs) # Block num LSB + cs = appendbyte(l, d[3], cs) # Block num MSB + cs = appendbyte(l, d[517], cs) # Block num MSB + + blknum = d[2] + 256 * d[3] + print('W{0:05d} '.format(blknum), end='', flush=True) + b = blknum * BLKSZ + + if d[1] == 0x02: + file = FILE1 + else: + file = FILE2 + with open(file, 'r+b') as f: + f.seek(b) + for i in range (0, BLKSZ): + f.write(bytes([d[i+5]])) + + b = sock.sendto(bytearray(l), addr) + #print('Sent {} bytes to {}'.format(b, addr)) + + +with socket.socket(socket.AF_INET6, socket.SOCK_DGRAM) as s: + s.bind((IP, PORT)) + print("veserver - listening on UDP port ", PORT) + while True: + data, address = s.recvfrom(1024) + #print('Received {} bytes from {}'.format(len(data), address)) + if (data[0] == 0xc5): + if (data[1] == 0x03): + read3(s, address, 1, data) + elif (data[1] == 0x05): + read3(s, address, 2, data) + elif (data[1] == 0x02): + write(s, address, 1, data) + elif (data[1] == 0x04): + write(s, address, 2, data) +