VEServer - Virtual Ethernet Drive Server for Apple II
VEServer is a very simple virtual disk server for an Apple II equipped with
a compatible ethernet card (such as the Uthernet II.) VEServer can run on
Linux, Mac or Windows, provided Python v3 is installed. It is intended to be
used with the Apple II client program
VEDRIVE.SYSTEM which is included as
part of the ADTPro disk imaging program.
VEDRIVE.SYSTEM program is designed to communicate with the ADTPro
server, which is a multi-platform Java program. VEServer can be used in
place of the ADTPro server for this purpose. VEServer is a much smaller and
simpler program, so it is easier to modify and better suited to being run as
a system service.
VEServer can also support RS232 serial connections, in which case ADTPro's
VSDRIVE.SYSTEM should be used on the Apple II rather than
The default mode of operation is to use ethernet. See the Command Line
Options section below for information on how to switch to serial mode.
Principle of Operation
VEServer uses IPv6 and listens on UDP port 6502 for incoming datagrams from
VEDRIVE.SYSTEM. There are two types of supported request:
- Read disk block and obtain updated system date and time
- Write disk block
Two simulated drives are supported, backed up by disk files in
Order". These may be 143K or 800K floppy disk images or any volume up to the
ProDOS limit of 32MB.
.2mg container files are also supported, provided
the volume within the
.2mg file is in ProDOS order.
VEServer can provide system date and time in a similar manner to an Apple II
clock such as Thunderclock or No Slot Clock. Because the legacy ProDOS date
and time format will run out in a few years time, ProDOS 2.5 introduces a new
date and time format. VEServer uses the legacy format by default. If using
ProDOS 2.5 please specify the
--prodos25 flag to use the new format.
Command Line Options
VEServer accepts the following command line options; each option has a short form and a verbose form:
--help- Display brief usage information.
--prodos25- Use new ProDOS 2.5 date/time format (see above.)
--disk1=FNAME- Specify filename for disk 1 image.
--disk2=FNAME- Specify filename for disk 1 image.
--serial- Use RS232 serial rather than Ethernet.
--baud=nnnnn- Specify baud rate when using serial connection.
--disk2=FNAME options are not specified, VEServer
will fall back to using the default values hard coded at the top of the
Running in a Shell
You can just run
veserver.py directly, for example
./veserver.py --prodos25 -1 /home/woz/hd32_1.po -2 /home/woz/hd32_2.po.
When run in a shell, each block number read or written is logged, and vt100
escape codes are used to colourize the output. Reads are shown in green and
writes in red. If a block number is prefixed by a
+ symbol this indicates
that VEServer believes this is a duplicate request, which is usually caused by
UDP packet loss. If a block number is shown prefixed by
X, this indicates
a checksum failure (not seen in normal operation.)
Running as a System Service using Systemd
A sample Systemd unit file
veserver.service is provided. This has been
tested on Raspbian (Raspberry Pi) but may need modifications for other
distributions of Linux. On most systems you just need to edit the
veserver.service file to reflect the path where
veserver.py is installed
and copy it to
Once the service file has been installed, you can control the
service as follows:
systemctl start veserver
systemctl status veserver
The reads and writes are logged to the system log and may be seen using the following command:
systemctl stop veserver
Rather than using colour to indicate reads and writes the letter 'R' or 'W' is shown before the block number in the log.
Working with Multiple Apple II Clients (Advanced)
If you use
VEDRIVE.SYSTEM on more than one Apple II machine, it is sometimes
convenient to be able to use different disk images on each machine. VEServer
offers a way to do this.
Suppose the disk1 filename is set to
virtual-1.po and the disk2 filename is
virtual-2.po (either using the
command line parameters, or using the hard-coded default.) Further, suppose
the IP address of the Apple II client is 192.168.0.100. In this case, when
accessing drive 1, VEServer will first look for the file:
If this is found that file will be served. If not found, VEServer will fall back to:
Similarly for drive 2,
virtual-2-192.168.0.100.po will be used if it exists,
This mechanism allows you to serve different disk images for each client, allowing read/write access with no risk of data corruption due to simultaneous access.