I entered the Stanford Computer Science Department as a grad student in fall of 1968, but my interest waned before my Ph.D. dissertation waxed. I went to a lot of movies and worked at the wonderful Festival Cinema in downtown Palo Alto with a crazy group of friends. I loved to talk about classic film, write movie blurbs, and run the big projectors, but sweeping floors and cleaning bathrooms soon got old. I had been a T.A. for Don Knuth, and when Don came into the Festival in early February 1977 and asked what I was doing, I told him I was looking for a programming job. The following day, Don got a cold call from Bob Swartz, who was looking for a programmer. Don gave Bob my phone number.
Microprocessors had been around for a couple years by 1977, but homebrewed personal computers were in their infancy. Bob was an early adopter, starting with an 8008-based system, and he foresaw the growth potential of microprocessor-based systems. He wanted his startup Mark Williams Company to sell a BASIC interpreter for 8080s, to compete with Bill Gates' MITS BASIC. I told him I could write it for him in four months (just a wild guess). I hated BASIC but needed a job, Bob let me work from home, and I figured I could stand programming for a couple months. I still worked for Bob when Mark Williams Company closed 18 years later.
Because disk drives (that is, 8" floppy drives) were in short supply at the time, I commuted from Palo Alto to Pacific Grove to use Gary Kildall's machines for a couple months (see my CP/M source page). Soon I got my own machine; I've had computers in my house and worked from home since then (mid-1977).
The BASIC interpreter I wrote was called XYBASIC. It predated the American National Standard for Minimal BASIC (ANSI X3.60-1978), but later I tried to make it comply to the Standard. The first version fit in 4K, with integer arithmetic only. It grew to 8K when I added a floating point package, and to 14K as I added more features. When the 9511 numeric coprocessor came along, I adapted XYBASIC to use it if present (using self-modifying code!). XYBASIC ran under CP/M (an operating system from Digital Research), under ISIS-II (an operating system from Intel), and in a standalone version; MS-DOS did not yet exist. XYBASIC was often used for process control applications. I performed custom modifications of it for several OEM customers, so the source is heavily conditionalized. Mark Williams marketed XYBASIC for several years, but over time its business migrated to C compilers and the COHERENT operating system, an early Unix look-alike.
I wrote the XYBASIC Programming Manual as well as the code. I no longer have the original source files for the manual, but I still have several hard copies. A tarball containing scanned manual pages is here. I converted the scanned pages to a manual webpage and to PDF.
In the early days of personal computers, before PCs supported networking, moving bits between machines was nontrivial. I never migrated the XYBASIC source kit to more modern machines. I kept many boxes of 8" floppies, but eventually my last machine with an 8" floppy drive died. Many years later, I deep-sixed most of the floppies, but kept a set of XYBASIC source floppies (3 diskettes dated 11/8/81).
In March 2014, Emmanuel Roche contacted me after seeing references to XYBASIC on my website. Emmanuel put me in contact with Steven Hirsch, who said he could probably read the floppies. I mailed my floppies to Steven, who performed some magic incantations and sent me a tarball of the disk images and extracted files in May 2014. Source fp9511 as extracted from the scanned diskette images is incorrectly truncated, but the source referenced below is corrected.
The XYBASIC source kit (identified in version as REV 2.14.00 5/27/81) contains 33 source files (ca. 21,000 lines) written in assembly language for the CP/M macro assembler (MAC), as listed below. All have © dates in the range 1978-1981. I wrote all except the floating point modules finout, fmath, fpbcd, and xmath. Each source begins with a comment giving last-modified date (maintained by hand, as CP/M filesystems did not have file timestamps at that time) and description:
|aux||11/19/80||statement auxilliary routines|
|benddisk||12/12/80||routines for Bendix SDISK version under Monolitic Systems MSOS.|
|bendix||12/12/80||FILES, SAVE and LOAD routines for Bendix version under Monolithic Systems OS|
|cam||09/07/79||CAMAC / North Star version routines for SAVE, LOAD, GTFIL, and i/o|
|camac1||11/05/80||statement and function routines for CAMAC version|
|camac2||07/10/80||routines for CAMAC version|
|cpm||05/21/81||CP/M version SAVE and LOAD, including GTFIL|
|finout||10/10/80||floating point input/output routines|
|fmath||06/09/80||floating point math package|
|fnsops||11/05/80||arithmetic and control function and op routines|
|fp9511||12/21/79||floating point package for 9511 chip|
|fpbcd||11/19/80||BCD floating point package|
|inout||12/05/80||input / output & error routines|
|isis2||05/21/81||statement routines for ISIS-II version SAVE and LOAD, plus GTFIL|
|nonst||08/06/80||routines for nonstandard version SAVE and LOAD, plus GTFIL|
|packard||01/23/80||custom version for Packard Instruments|
|ram||05/20/81||RAM storage for non-ROM versions|
|rom||12/12/80||RAM EQUates for ROM version|
|sdisk||01/12/81||statement routines for CP/M SDISK version|
|stacks||05/23/79||symbol table and control stack manipulation routines|
|states1||12/02/80||statement routines for statements ASSIGN through EXEC|
|states2||05/21/81||statement routines for statements FOR through NULL|
|states3||12/05/80||statement routines for statements ON through WAIT|
|strings||11/01/79||string routines and functions|
|tokenize||10/22/80||tokenization and line editing|
|wild||10/22/80||routines for Wild Heerbrugg version|
|xmath||06/09/80||floating point extended function package|
The source diskettes in the original tarball also include:
An XYBASIC program to strip source conditionals:
source.bas, source.xyb, xysource.bas, xysource.xyb (.bas is ASCII, .xyb is binary).
- A CP/M XYBASIC executable using BCD floating point: xycpmbcd.com
- CP/M executables: combine.com, ed.com, pip.com, stat.com, wm.com, xref.com.
- Other files, no clue what these are: intel.lib, waters.bak, waters.lib.
Once I had the resurrected source, I used Udo Munk's z80pack CP/M emulation and Michael Haardt's CP/M tools to build a CP/M XYBASIC object and run it. I ran the emulator on my MacAir under OSX, but the emulation and tools packages support other systems. Here's the log I kept, and here's some sample output. Emulated CP/M XYBASIC runs about 15x faster on my MacAir than it ran on standard 8080-based hardware. Building a working ISIS-II XYBASIC should be straightforward, but I haven't done it yet.
Udo built standalone XYBASIC objects (available on Udo's site) for Imsai 8080 and Altair 8800 emulators. Each displays an emulated front panel you can use to control XYBASIC while it runs, a real time machine trip; you can twiddle the Imsai's front panel lights with OUT 255, n in an XYBASIC program. These emulations are only slightly slower (.8x) than standard 8080 hardware when run on my MacAir.
Basically, you just concatenate the source files to make a source for assembly, but with a few constraints. Source version must be first, with the EQUates at the beginning set appropriately to specify the version you wish to build; in particular, exactly one of cpm, isis2, or nonst must be true to build the CP/M, ISIS-II, or standalone version, respectively. Source ram (for CP/M and ISIS-II versions) or rom (for standalone versions) must be next-to-last. Source initial must be last, as the initialization dialog code is overlayed by the user's growing XYBASIC program. Exclude the OEM-specific files benddisk, bendix, cam, camac1, camac2, packard, and wild.
XYBASIC source is © Mark Williams Company. It is posted as open source by generous permission of Robert Swartz, the current copyright holder.
Thanks to several people who made this page possible:
- Don Knuth: for passing my name to Bob Swartz, literally changing my life.
- Bob Swartz: for many, many years of collaborative work and friendship.
- Emmanuel Roche: for jump-starting the resurrection of the sources.
- Steven Hirsch: for reading my moldy (literally!) source disks.
- Udo Munk: it's truly amazing to see CP/M and XYBASIC from 1981 running on my MacAir in 2014!