Rewind to the dawn of computers, when people programmed on punch cards, and the jump from 110 baud to 300 baud was amazing, and 48K ram was enough to hold some pretty complex programs, and nothing was adapted or accessible.
In 1978 I went to Michigan State University, hoping for a degree in computer science. I didn't know anybody, and had to manage a huge campus, 3 square miles, with just a cane, no dog, no hand-held GPS, and very little support. And then there's the snow.
I started off with a light schedule, at the advice of those who were cautious, “We don't want him to fail”, and then I kicked myself, because college is, after all, a means to an end. By the third semester I started taking heavy loads, and also took summer classes, so I could be out in less than four years. After three years I decided I could push it, and get out in four years with a BS and an MS. It's a program called dual enrollment, taking undergrad and graduate courses at the same time.
In 1981, my last year at MSU, there were no talking computers or terminals, but I knew I would need one to participate in the work force. I would build one, for my own needs, and my masters project. (two birds) As you'll see below, I had to build it out of stone knives and bear skins.
Dr. Eulenberg was the right professor; he specialized in talking devices for the disabled. He was nationally recognized, and Nova did a special on his lab: Finding a Voice, aired 02/07/1982. Watch Now I missed the filming by one day. I was probably in classes when the show was being filmed. Damn! I could have been on tv!
Some of his clients were profoundly disabled. They were in motorized wheelchairs,and unable to control their hands, or speak. He made a board for them with glyphs. They could touch a glyph with the heel of their hand, and it would speak a word or phrase, thus facilitating a modest level of communication. This was the latest technology at the time. One of the computers held 4K of ram. Wow! The board had a plastic screen protector, because some of these folks couldn't control their own drool. Part of my education was learning there are people out there worse off than me. That isn't indicated on my degree, but it's important.
Their need was greater than mine, so I didn't mind when Eulenberg spent most of his time with them. He also taught classes, computer classes of course, and Hausa, an African language. There were 8 people in his Hausa class, out of 45 thousand students, but that was enough to make it a class. In between these activities he helped me as he could.
He let me use an Apple2E, the latest personal computer, with an SCO1 voice chip installed. That chip didn't turn text into speech, it only accepted codes for phonemes, i.e. consonants and vowels. 63 codes for the sounds of the english language. 37 might be s, 22 might be voiceless th, 18 might be long o, etc. I had to do my own text to speech, but there was a lot more to do first.
How do I interact with a computer that is silent? I wrote a basic program that did two things - accept a 4 hex digit memory location and beep in binary the contents of that memory location, and, accept location = value and assign a byte value to that memory location. These are the peek and poke operations in basic.
How did it beep? By printing control g to the screen. That made a beep, and the only sound the Apple computer could make. I had to time the beeps and pauses just right so I could understand the binary.
I wrote the basic program out in braille, then went bravely to Eulenberg's lab. I had to type it in perfectly, the first time, with no errors, or I was stuck in enigmatic silence. Eventually I got it right, and I saved it to a floppy disk. That was my tool for a while, poking bytes into memory locations and reading bytes back out by the beeps of the control g bell. I'll call it tool1.
Next, instead of beeps, I needed something more efficient. I sent phonemes to the chip to sound out the hex digits. Let's call this tool2. It was a lot faster and more accurate than beeps. I used q for b, because b and d sounded alike, and I used l for e, because e and d sounded alike, and I used x for a, because a and 8 sounded alike. I dare not make a mistake as I moved forward in my work.
Dr. Eulenberg read me the spec for the chip: what port to poke to send a phoneme code, and what port to peek to see when it was done speaking. Thus I was able to build tool2, and work more efficiently. Eulenberg didn't have time to sit for hours and help me write and debug my software, but he helped me with these technical details. He was one of the kindest men I ever knew, and it was my honor to work with him.
A couple of years earlier, Dick, my roommate, taught me 6502 machine code, bytes and instructions, so I could write machine language programs for the Apple. Using tool2, I wrote a few simple programs by putting hex values into memory. I then jumped to that location, to run the program as a subroutine. The first few didn't do much. They couldn't, because the slightest mistake locked up the computer in silence. I had to power it off and on, load my programs off the floppy, start again, and only guess what I might have done wrong. So it's important to be incremental here.
Using tool2, I wrote a machine language program that did pretty much what tool2 already did, but in machine code, not in basic. The translation was mechanical, accept for getting input. I had to read bytes directly from the keyboard, since the basic interpreter wasn't doing it for me any more. I'll call it tool3.
I enhanced tool3, to make it easier to write other machine language programs. Return would read the next byte, minus would back up one location in memory, space would let me assign a new value to memory, and so on. It still spoke the values in memory using my hex codes through the SCO1 chip: 0123456789xqcdlf.
If I wanted to add an instruction to the middle of a program I was working on, I would set my location, like a cursor, then type >. That pushed everything up one byte, and inserted ea, which is the no-op instruction for the 6502 processor. But it had to do more. If there was a relative branch around this area, I had to add one to that jump. One more byte ahead, or one more byte back, because the space between is one byte longer. If the jump became more than 127 bytes, then my tool beeped and didn't do anything. I couldn't support a relative branch that far. I had to go back and make it an absolute two-byte jump, then I could insert the byte. I inserted as many bytes as I needed for the new instructions.
< would delete one byte, an instruction I didn't need any more. Hit < repeatedly to delete a range, but don't do it too many times, or you're in a lot of trouble. < also adjusted the relative branching around the area. The jumps were one byte closer.
r relocated the program to another place in memory, adjusting all the absolute addresses so it would still run. Somewhat like a linker. I added all these features to tool3, to make it more powerful. I may as well call it tool4.
Next I wrote a crude text to speech program, turning written English into sounds. It wasn't great but it was only for my ears. I learned its quirks and shortcomings, and it was good enough. I'll call this tts.
Now to complete the puzzle, I had to have this Apple act as a computer for the mainframe on campus, and eventually, the computers for anyone who wanted to hire me. The Apple had to talk to other machines. This was done over an rs232 port. Dr. Eulenberg installed an rs232 card and taught me where the memory locations were that corresponded to the pins, and how to access them, and how to activate them. This was all raw at the time. To read a byte from another computer I had to monitor the voltage on a pin, watch it go up and down, and time it by counting computer cycles in between. This meant I had to know exactly how fast the cpu clock ran, and how many clock cycles were consumed by each instruction. I gathered the bits into a byte, and put the byte into my buffer, whence it was available to be read by my tts engine. On the outgoing side, I had to raise and lower the voltage on the pin by timing loops: spin, high, spin, low, and so on. I had to know how long each computer instruction took, how long a loop would take to run, and the rs232 spec of how to change the voltages to send out a byte, including stop bits and parity - and I had to adjust it for different baud rates, 300 to 9600. Like I said, stone knives and bear skins.
Eventually I got all this working. I could call the master computer on campus from my office in Eulenberg's lab, and receive bytes in the buffer, and read them using my tts software and the SCO1 chip, and type in commands, and send those back out to the mainframe over rs232. After a years worth of hard work, the MSU mainframe was accessible to me, along with any other computer that I could call up by modem.
Meantime, I took a heavy load of undergraduate and graduate courses in math and computer science, in order to complete my degrees, and I got A's in all of them. And I managed my own personal world, getting around, finding the things I needed, applying for jobs, etc. I guess I was younger back then. Just the thought of it exhausts me now. 😩
Don't get it twisted; I got a lot of help. it's ok to toot your own horn, but nobody succeeds without help. I could give a long list of acknowledgements here and probably should, but they would be just names to you. At the very least, my thanks to Dr. Eulenberg, Dick, and Jay. Even with all this help, I think very few people could have done what I did. I'm just gonna put that out there.
After MSU, I took my software on my floppies to Bell labs. They got me set up with an Apple2E, and I was talking to their computers, just like the other employees on their visual terminals. I was learning Unix and C on an equal footing with everyone else.
During the next 40 years I developed other tools, a speech adapter for linux, (originally embedded in the kernel), and edbrowse, a line oriented editor browser. There is a theme here. I write the tools I like, just the way I like them. This might be silly, or obsessive, but there it is. Read more about my command line philosophy here. It started in 1981 when I had no choice, and I guess I can't get out of the habit. I take some comfort in knowing that others benefit from these tools as well. I have added quite a few features at their request. So it isn't all about me.
Epilogue:
Doing all the above was incredibly difficult at a technical level, but it was also taxing at a physical level. I mentioned the snow in passing, as though it were a minor nuisance; it was more than that. I believe it was Harold Krents who said, “Snow is the blind man's fog.” (Trust me, there's plenty of snow in Harvard in the winter.) Truer words were never spoken. When there was five inches on the ground, I veered off the path and never knew it. Soon I was 50 feet from the sidewalk, travelling in a random direction. At that point I knew I was lost, and simply had to wander until I ran into something familiar, or a citizen came over and rescued me.
“Where are you headed?” she would ask.
“Wells Hall.” I might reply, through tears that were freezing on my face. I was already late for class, and trust me, if you miss half of a graduate level class in complex analysis, and you don't even have the book at home to review, it's hard to catch up. No wonder I went to the University of California Berkeley ten years later. No more snow! 🌨 Just sunny skies. 🌞
There was another hazard, more dangerous than snow, and it was within my own dorm. Almost everyone on my floor had a loft in their room, including me. The rooms were small, and there was more living space if your bed was up in the air. Plenty of room for the couch and desk and tv and stereo beneath. It also formed a partition of sorts; one roomie could study below, with the desk light on, while the other roomie slept above. These lofts are common in some universities, and nonexistent in others. For example, I saw not a single loft at Berkeley.
Students graduated, or moved out, and tried to sell their lofts to the new students moving in. It was an interesting exercise in free market economics. This occurred mostly at the beginning and end of each semester, though it could happen at any time. During the transition, students left parts of their lofts out in the hallway. Remember, the rooms were small. Sections of loft could be simple 2-by-4's, or larger portions of the frame. All the other students dodged them without trouble, but I didn't have that luxury. I used my cane of course, but sometimes boards would stick out at face height. Too many times I slammed right into a board. This caused more trepidation than crossing streets on the way to class. More than once I ran into a protruding bolt or screw. A couple of times lady luck was not on my side, and the bolt rammed directly into my eye. My knees buckled and I sat down on the floor. I held my head as tears began to flow. But I had to shake it off, get back up, and head out; I had things to do.
The RA did try to help. He knocked on doors and said, “Can't you keep that stuff in your room?” If the student protested, the RA continued, “Can't you at least keep it flat against the wall, and not sticking out? Remember there's a blind man on the floor.”
“Oh yeah.” he might reply. “I forgot. Sorry 'bout that.” It never occurred to him. But then next week another loft would be under construction, or deconstruction, so it was hard to keep up.
As a side note, my dorm was on the edge of campus, about as far away from my classes as you could get. Also, my room was at the end of a long hallway, on the top floor, as far away from the main entrance as you could get. Ironically, that's where I was assigned, at random, by the housing computer. This, combined with the loft hazards described above, seems like a stroke of bad luck - but my roommate, Dick, whom I wrote about earlier, was the only student on campus to have a personal computer, the only student who could help me learn Apple assembly and start me on this journey, so I guess this is where I needed to be.
At this point you might ask a couple of questions.
Reader: “Karl, why didn't you stay in the center of the hallway? Surely these hazards didn't extend all the way to the middle of the hall. I know your echolocation is good. You told me how you could walk all the way down that long hall with no cane and hands at your side and never touch a wall. How you and your friends performed scientific experiments on the subject. You covered your face and accomplished the same feat. That effectively debunked the theory of Facial Vision, which is what they called it in the 70's. They thought there was sense organs in the face or some such, but that's not how it works. You then tried to do the same thing with ear plugs in your ears, and bounced off the walls like a pinball machine. The phenomenon is completely auditory - a form of echolocation. So with that extra sense that God gave you, why didn't you stay in the center of the hall?”
Me: “I did, for the most part. But at some point I had to move to the wall, to count doorways, or feel the numbers on the doors, so I knew which room was mine. remember that I lived near the end of the hall.”
Reader: “Even when you were close to the wall, your echolocation wasn't good enough to sense the boards sticking out?”
Me: “Sometimes it was, sometimes not. If the board was thin, say a 2-by-4 edge on, I can't sense that. I can only hear large objects that make a substantive change in the acoustic landscape. I'm not a bat. So sometimes I sensed it and jerked to the side at the last minute, and sometimes I smacked into it full on, perhaps at high speed if I was late for class.”
Reader: “So why didn't you get a dog? You got a Leader Dog in 1991, to help you navigate the streets of Chicago, and it was wonderful! A dog would have skirted you around these obstacles, escorted you safely across the streets, and kept you on the paths, snow notwithstanding.”
Me: “I thought about it, especially when I realized what I was up against. But a dog is a significant responsibility, more than most people realize. I was on the top floor at the end of the hall; imagine having to take a dog out three or four times a day from that location. And sometimes a dog has to go out quickly. Dogs get sick, just like people get sick. Have you heard the sound of a dog about to throw up? It's a glurping sound, glurp glurp glurp glurp. You get about six warning glurps, perhaps 30 seconds, and then it's coming up. Can you get your dog outside in 30 seconds? I could, when it was my house in Naperville or my office in Chicago and I was close to the door. That was impossible in my dorm room. And who would help me clean things up? My wife said For better or for Worse, but my roommates didn't make that kind of commitment, and I didn't want to foist that upon them. I never wanted to inconvenience anyone, especially the people that I lived with, i.e. the people who were randomly assigned to live with me. This, combined with food and brushing and maintenance and vet visits, seemed like it was too much. So I stayed with my trusty cane.”
For many reasons, this time in my life was extremely challenging. Most of this article addresses the technical hurdles: completing my bachelors and masters in math and computer science, while developing the first talking terminal, in machine code, and using the lowest level phoneme and serial chips. But there were physical challenges as well. Just getting to class, or to Eulenberg's lab, was sometimes a harrowing experience. I still look back at it all in disbelief. When others tell me how difficult their life is, and how hard they have to work, I listen politely, not wanting to turn it into a Luxury competition, but if it was a contest, I bet I'd be in the finals, in there with the best of them. I say again, and with some pride, very few people could have done what I did.