The Naming of Names

Perhaps you once took a university course in Operating Systems.  Or you think you did.

In reality, the course catalog ought to have read: Dark Age Software Archaeology: A UNIX Case Study.

But do we still call it archaeology if people are still building pyramids? Moreover, if architects continue to push the pyramid as the pinnacle of architecture?

Before the advent of structural steel, the pyramid was the only form of building which could exceed a height of around five stories.  Now imagine that the building industry had simply ignored all advances in metallurgy.  This is precisely what happened in computing:  CPU architectures with built-in array bounds and type checking obsolete the entire computer security field as it now exists, in just the same way modern medicine obsoletes bloodletting – which is one reason why we are denied them.

Likewise, my dear readers, some of you may recall attending lectures entitled “Human-Computer Interaction,” or “User Interfaces.”  In fact, the course should have been called WIMP: Twentieth-Century Computing and the Cult of the Novice.” [1]  [2]

The list could go on:  I’m probably not the only person who took a Theory of Computation class which taught the Turing Machine yet breathed not a word about the Lambda Calculus.


[1] Erik Naggum: “The Novice has been the focus of an alarming amount of attention in the computer field. It is not just that the preferred user is unskilled, it is that the whole field in its application rewards novices and punishes experts. What you learn today will be useless a few years hence, so why bother to study and know anything well?”

[2] Think there’s been substantial progress in the GUI since 1981? Think again.

Posted in: Hot Air, NonLoper by Stanislav 2 Comments

Nock Nock (Part 1)

Here is a very simple Common Lisp compiler [1] of NockC. Yarvin’s elegant systems language.


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; *************************** define reader macros ***************************
(eval-when (:load-toplevel :execute)
  (defmacro char-macro (ch &body body)
    `(set-macro-character ,ch #'(lambda (stream char)
				  (declare (ignore char)) ,@body)))

  ; define syntax of N-expression
  (char-macro #\[
    (reduce #'(lambda (&rest exp)
		(if (functionp (car exp)) exp `(list ,@exp)))
	    (read-delimited-list #\] stream t)
	    :from-end t))

  (set-syntax-from-char #\] #\))

  (defun div (a b) (/ a b))  ; we will want to preserve
  (defun mul (a b) (* a b))  ; and use '/', '*', and '='
  (defun es (a b) (= a b))   ; after they are clobbered.

  (defvar %nk-ops% '()) ; table of Nock operator names

  (macrolet ((opchar (ch name) ; mutilate the Lisp reader into a Nock reader
	       `(progn
		  (push (cons ',name ,ch) %nk-ops%)
		  (char-macro ,(character ch)
		    (list ',name (read stream t nil t))))))
    (opchar "?" QMARK)  (opchar "^" CARROT) (opchar "=" EQSIG)
    (opchar "/" FSLASH) (opchar "*" NOCK))
)
; *************************** define reader macros ***************************

(eval-when (:compile-toplevel :load-toplevel :execute)
  (defun nkcar (E) (if (listp E) (car E) E))
  (defun nkcdr (E) (if (listp E) (cadr E) nil))
  (defun cellp (exp) (and (listp exp) (not (symbolp (car exp)))))

  (defun nk-print (E)
    (cond ((null E) "")
	  ((atom E) (write-to-string E))
	  ((listp E)
	   (let ((hd (car E)))
	     (if (symbolp hd)
		 (concatenate 'string
			      (cdr (assoc hd %nk-ops%)) (nk-print (cadr E)))
		 (concatenate 'string
			      "[" (nk-print hd) " " (nk-print (cadr E)) "]"))))))

  (defmacro mk-op (name &body body)
    `(defun ,name (args)
       (let ((hd (nkcar args))
	     (tl (nkcdr args))
	     (same (list ',name args)))
	 ,@body)))

  (mk-op QMARK (declare (ignore hd same)) (if (null tl) 1 0))
  (mk-op CARROT (if (and (null tl) (numberp hd)) (1+ hd) same))
  (mk-op EQSIG (if (and (atom hd) (atom tl)) (if (eq hd tl) 0 1) same))

  (mk-op FSLASH
    (if (null tl)
	same
	(cond
	  ((eq hd 1) tl)
	  ((and (eq hd 2) (cellp tl)) (car tl))
	  ((and (eq hd 3) (cellp tl)) (cadr tl))
	  ((and (numberp hd) (> hd 3))
	   (if (evenp hd)
	       /[2 /[(div hd 2) tl]]
	       /[3 /[(div (1- hd) 2) tl]]))
	  (t same))))

  (mk-op NOCK
    (if (cellp tl)
	(let ((x (car tl))
	      (b (cadr tl)))
	  (if (cellp x)
	      [*[hd x] *[hd b]]
	      (case x
		(0 /[b hd])
		(1 b)
		(2 (if (cellp (nkcdr b))
		       *[hd 3 [0 1] 3 [1 (caadr b) (cadadr b)]
		        [1 0] 3 [1 2 3] [1 0] 5 5 (car b)]
		       same))
		(3 **[hd b])
		(4 ?*[hd b])
		(5 ^*[hd b])
		(6 =*[hd b])
		(t same))))
	same))

  (defun nockl ()
    (loop
       (format t "~&NOCK> ")
       (finish-output nil)
       (let ((form (read)))
	 (if (eq form :q) (quit))
	 (write-string (nk-print (eval form)))
	 )))

  (defun nock-repl ()
    (format t "~&Type any Nock expression, or :q to exit.~%~%")
    (nockl))

  (nock-repl) ; enter the REPL.
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Not quite one page, but rather small and extensible:  adding “jets” (see Yarvin’s article) and other optimizations will be trivial.

Next:  memoization and pretty-printing.

To be continued.

It is worth noting that nothing like the above could have been written in Clojure, for it lacks user-defined reader macros.


[1] This is a “threaded” native-code compiler if and only if your Lisp system is also such a compiler – for example, SBCL.  Otherwise, it is an interpreter.

Tenser, Said the Censor [*]

Dear Readers,

Not long ago, some of you submitted my writings to Hacker News.  I recommend against doing this, if you value your reputation there.

The editors of Hacker News appear to have taken an active dislike to this site.  I don’t care to hazard a guess as to why.  They have begun deleting any link to loper-os.org which rises too high in their automated rankings.  That such a rise could take place without any subterfuge involved is beyond their ability to imagine. Anyone who submits this site to Hacker News or clicks the “up vote” for such a submission risks being regarded as a spam drone serving in my Army of Darkness.  [**]  I know that some of you enjoy participating in that community and would not wish such a thing to happen to you.  You have been warned.

Sincerely,

-Stanislav


[*]   With apologies to Alfred Bester.

[**]   Anyone who can locate an advertisement, donation button, or other instrument of profit on this site shall win my entire yearly marketing budget.

Posted in: Distractions, NonLoper, Reactions by Stanislav 4 Comments

The Performance of Lisp, or Why Bean Counters Need Bigger Bags of Beans

One critic, echoing the voices of thousands, asks:

“Surely if Lisp makes a programmer N times more efficient, then it would be easy to study scientifically. Have there been any studies comparing productivity?

I wish I could reply with the immortal words of Babbage.  But alas I cannot.  Sadly, I can indeed “apprehend the kind of confusion of ideas that could provoke such a question.” It is the confusion which inevitably follows from a bean-counter mentality applied to subjects which are fundamentally alien to it and the culture it has been shaping since the start of the Industrial Revolution.  For instance, take the very word “productivity.”  It is meaningless alone.  One must always ask, productivity at what?  If the productivity in question is in the act of being a pyramid builder following orders and bringing to life the ideas of others, then without question the productivity of many a Lisp programmer is something less than heroic.  This has nothing to do with Lisp, and everything to do with the kind of people who find it appealing.  Now, if we’re talking about productivity at undirected invention, the story of Lisp becomes a very different one.  To the now-scorned Lispers we owe garbage collection, all the roots of the modern GUI, dynamic typing, lexical scope, the very idea of a single-user computer workstation, and countless other innovations which so many people believe to have simply dropped from the sky (or worse yet, to have been invented by the sociopathic hucksters who have managed to weld their names to these marvels through Machiavellian business acumen.)

The Lisp Machine (which could just as easily have been, say, a Smalltalk machine) was a computing environment with a coherent, logical design, where the “turtles go all the way down.” An environment which enabled stopping, examining the state of, editing, and resuming a running program, including the kernel. An environment which could actually be fully understood by an experienced developer.  One where nearly all source code was not only available but usefully so, at all times, in real time.  An environment to which we owe so many of the innovations we take for granted. It is easy for us now to say that such power could not have existed, or is unnecessary. Yet our favorite digital toys (and who knows what other artifacts of civilization) only exist because it was once possible to buy a computer designed specifically for exploring complex ideas.  Certainly no such beast exists today – but that is not what saddens me most.  Rather, it is the fact that so few are aware that anything has been lost.

It is indeed possible to measure the productivity of Lisp – just as it is possible to measure the productivity of, say, the scientific method.  You would not attempt to weigh the latter by setting up a gladiatorial match between stereotypical African shamans and stereotypical American physicists (randomly plucked from Los Alamos, say.)  Yet there is no end to similar suggestions for measuring the value of programming systems.  I am no mystic, and believe that productivity could in principle be measured (once you define the word.) However, you must measure it on the time scale where it is relevant. The productivity of inventors and the tools of invention cannot be measured in the same manner as the efficiency of two competing pieces of construction equipment – especially not in a society which routinely deprives inventors of the fruits of their labor and awards everything to the slick and hypersocialized.

Yes, my dear bean counters, you can measure productivity.  I would no more ask you to stop in your attempts at its measurement than I would ask mosquitoes to stop sucking blood.   You can measure productivity – even of Lisp; even of political philosophies.  You will simply need to secure a very large bag of beans – one deep enough to hold a bean for every twist and turn of a century of tinkering, politicking, and everything else associated with the messy business of successfully thinking new thoughts.

Posted in: Hot Air, Lisp, NonLoper, Philosophy by Stanislav 1 Comment

Where Lisp Fails: at Turning People into Fungible Cogs.

A favorite conundrum of many Lisp aficionados is why the language appears to languish in disuse.  Talk of cultural problems, “the library question” (which usually boils down to nonsensical circular reasoning), too many parentheses, and other absurdities simply dances around the blindingly obvious explanation – one which is able to make sense not only of the obscurity of Lisp, but of many other conceptual breakthroughs (such as reflectivity) which threaten to give developers’ minds a “lever to move the whole world.”

Employers much prefer that workers be fungible, rather than maximally productive.

Yes, this holds true even at that most beloved megacorporation citadel of angels:

“One of the reasons I stayed at JPL for twelve years was that I was appalled at what the software industry had become. The management world has tried to develop software engineering processes that allow people to be plugged into them like interchangeable components. The “interface specification” for these “components” usually involves a list of tools in which an engineer has received “training.” (I really detest the use of the word “training” in relation to professional activities. Training is what you do to dogs. What you should be doing with people is educating them, not training them. There is a big, big difference.) To my mind, the hallmark of the interchangeable component model of software engineers is Java. Without going into too many details, I’ll just say that having programmed in Lisp the shortcomings of Java are glaringly obvious, and programming in Java means a life of continual and unremitting pain. So I vowed I would never be a Java programmer, which pretty much shut me out of 90% of all software engineering jobs in the late 90’s. This was OK since I was managing to put together a reasonably successful career as a researcher. But after Remote Agent I found myself more and more frustrated, and the opportunity to work at Google just happened to coincide with a local frustration maximum. One of the reasons I decided to go work for Google was that they were not using Java. So of course you can guess what my first assignment was: lead the inaugural Java development at the company… The interchangeable component model of software engineers seemed to work reasonably well there. It’s just not a business model in which I wish to be involved, at least not on the component-provider side.”

Erann Gat, “Lisping at JPL”

It amazes me just how blindly complacent programmers have been in the face of the ongoing and very successful deskilling of their profession.  Instead of rebellion, we see mass Stockholm Syndrome.  There is no shortage of pundits ready to bloviate at nauseating length on nearly every – even the most trifling – perceived shortcoming of Lisp [1], other than this one.  Once in a very long while, some daring soul will call out the “elephant in the kitchen” openly and directly:

“…in contrast, the C/C++ approach is quite different.  It’s so damn hard to do anything with tweezers and glue that anything significant you do will be a real achievement.  You want to document it.  Also you’re liable to need help in any C project of significant size; so you’re liable to be social and work with others.   You need to, just to get somewhere.  And all that, from the point of view of an employer, is attractive. Ten people who communicate, document things properly and work together are preferable to one BBM hacking Lisp who can only be replaced by another BBM (if you can find one) in the not unlikely event that he will, at some time, go down without being rebootable.”

Mark Tarver, “The Bipolar Lisp Programmer”

I predict that no tool of any kind which too greatly amplifies the productivity of an individual will ever be permitted to most developers.  In this they shall follow in the maximally deskilled assembly-line footsteps of their grandparents.  “They’ll time your every breath.” As for the “free software” world, it eagerly opposes industrial dogmas in rhetoric but not at all in practice.  No concept shunned by cube farm hells has ever gained real traction among the amateur masses. [2]


[1] Ever wonder why it is customary to speak of the wildly different Common Lisp, Scheme, ZetaLisp, Emacs Lisp, etc. as though they were a single language? I would like to suggest that we start referring to C/C++, Java, Python, etc as ALGOL.

[2] Consider Linux: the poster child of successful free software.  It is a knockoff of a 1970s operating system well past its sell-by date. This is because a herd simply cannot innovate, whether for fun or for profit. Every innovative work of mankind has been the product of one – sometimes two, rarely three – minds.  And never the work of a herd.  No mathematical theorem, no enjoyable novel, no work of art of any importance, have ever been produced by a herd.   I fail to see why innovative software ought to play by a different set of rules.

Posted in: Hot Air, Lisp, NonLoper, Philosophy by Stanislav 18 Comments

You have made your bedrock, now lie in it.

As a child, I was quite fond of old-fashioned Lego bricks.  One very endearing but rarely discussed property of such bricks is their durability, bordering on the indestructible.  Almost any abuse inflicted on a Lego structure will, at worst, leave you with a pile of bricks entirely like the one you started with.  Even the most baroque Lego edifice will always break into Legos, and not jagged shards of plastic.  In my childhood, this felt like something approaching an elementary physical law.  As with many real physical laws, it applies in a restricted (though usefully broad) domain: a Lego castle dropped from the Empire State Building or crushed in a garbage compactor will leave behind many pieces still recognizable as Legos, and almost certainly a few which are not.  However, in my childhood I did not have ready access to garbage compactors or the roofs of tall buildings, and so the Lego brick seemed like an impregnable elementary particle: a bedrock abstraction.

bedrock abstraction level is found in every man-made system.  No recoverable failure, no matter how catastrophic, will ever demand intelligent intervention below it.  Repair at those depths consists purely of physical replacement. [1]  No car crash, however brutal, will ever produce piles of loose protons and neutrons.  When a Unix binary crashes, it might leave behind a core dump but never a “logic gate dump” and certainly not a “transistor dump.”  Logic gates and transistors lie well below the bedrock abstraction level of any ordinary computer. [2]

The computers we now use are descended from 1980s children’s toys.  Their level of bedrock abstraction is an exceedingly low one.  This would be acceptable in a micro with 64K of RAM, but when scaled up to present proportions it is a nightmare of multi-gigabyte bloat and decay. Witness, for instance, the fabled un-debuggability of multi-threaded programs on today’s architectures.  It stems purely from the fact that truly atomic operations can only exist at the bedrock level, and to fully comprehend what is going on in the entire machine requires wading though a vast sea of binary soup, boiled and stirred continuously by an asynchronous world.  The futility of this task is why programmers aren’t usually given even a sporting chance – observe the lack of a hardware debugger in any modern computer.

Once in a while, barring a whiff of the proverbial magic blue smoke, a hardware-level malfunction makes itself known through a fit of non-deterministic behavior in that rare bird, a piece of known-good software. Yet, to a first approximation, solid state hardware will spend years doing exactly what it says on the box, until this hour comes.  And when it has come, you can swap out the dead parts and be guaranteed correctness again.

Software, on the other hand, routinely ships broken.  And software cannot be meaningfully repaired or replaced, only re-designed.  Yet witness the cries of righteous outrage among software vendors whenever hardware deviates ever so slightly from its advertised function.  What software company could honestly lay claim to even the lowliest silicon pusher’s levels of bug-free operation and architectural soundness?  I cannot help but picture a stereotypically slick and unrepentant con artist, frothing with rage after having been duped into purchasing a costly full page ad in what turned out to be a Skeptic society’s periodical.  It appears that Microsoft (and now Apple) is entitled to comfortable and stable bedrock abstractions, while you and I are not.

I sometimes find myself wondering if the invention of the high-level compiler was a fundamental and grave (if perhaps inevitable) mistake, not unlike, say, leaded gasoline.  No one seems to be talking about the down-side of the compiler as a technology – and there certainly is one.  The development of clever compilers has allowed machine architectures to remain braindead.  In fact, every generation of improvement in compiler technology has resulted in increasingly more braindead architectures, with bedrock abstraction levels ever less suited to human habitation.

Nevertheless, high-level architectures still developed, though most were strangled at birth by political forces.  Think of where we might be now, if the complexity of programming a computer had been ruthlessly pruned at the source, rather than papered over with clever hacks.  Dare to imagine a proper computer – one having an instruction set isomorphic to a modern high-level programming language.  Such a machine would never dump the programmer (or user) by surprise into a sea of writhing guts the way today’s broken technologies do.  Dare to imagine a computer where your ideas do not have to turn into incomprehensible soup before they can be set in motion;  where there is, in fact, no soup of any kind present in the system at all.  It would be a joy to behold.

I posit that a truly comprehensible programming environment – one forever and by design devoid of dark corners and mysterious, voodoo-encouraging subtle malfunctions – must obey this rule:  the programmer is expected to inhabit the bedrock abstraction level. And thus, the latter must be habitable.

Notes

[1] Note that the converse does not hold: human ingenuity has gifted us with systems which break far above the bedrock abstraction level, yet are still not meaningfully repairable.  Witness any piece of electronics with buggy firmware, where the latter is non-flashable or the manufacturer is defunct (or unwilling to patch.)

[2] A system implemented on an FPGA, or built from the once-ubiquitous bit-slice logic chips would have a much lower level of bedrock abstraction.  However, it is worth noting that a modern FPGA architecture is somewhat less fine-grained than the “sea of gates” imagined by the novice hardware description language programmer.  An FPGA aficionado is still living in another’s universe, and it isn’t necessarily one where each and every constraint imposed on you makes sense – certainly if you lack the closely guarded architectural manuals.

The Nook, the Cranny, and the Lend Me Not.

The Nook, Barnes & Noble’s answer to Amazon’s Kindle, was greeted with fanfare for including a feature which allows users to “lend” a purchased book to anyone, with a guarantee of recovering it later. The first announcement I came across mentioned no other rules governing the lending process. My first thought was that such an option is essentially a loophole – one which would allow almost anyone to circumvent payment for more-or-less unlimited access to almost anything in the Nook catalog, and that this lending feature is (or soon will be) severely crippled, lest the hole expand to highway size and a mockery be made of the very concept of artificial scarcity.

A simple thought experiment is in order. Let’s pretend that a Nook book (or any similar DRM’d ebook) could be lent in exactly the same manner as a physical book: to whomever you like, whenever you like, for as long as you like – with the added benefit of instantaneous, guaranteed, and toll-free shipping in both directions. This suggests that one could set up a library – a perfectly legal thing to do with physical books. The library (let’s call it Cranny) would consist of an online service which automates the process of requesting a Nook book from anyone who owns a copy but isn’t reading it at the moment. It would also allow you to send a request to recover any of the books you have lent out, with the same speed and ease. Consider: how many of the physical books on your shelves are you currently reading? In the course of any given hour? day? week? month? There is no reason to suppose that this situation would be any different for electronic books. The result: once a Nook book has been purchased by some critical number of Cranny users, just about all future readers would be able to enjoy it for free, with the aid of a vast global library. In fact, the entire process of pretending that a limited number of copies of a work exist (with the resulting need to ration access) becomes a farce. The Cranny scenario is clearly unacceptable to B&N, and (unsurprisingly) they have crippled the Nook’s lending mechanism to prevent it – just as I predicted upon first hearing of the device. It turns out that a Nook purchase can only be lent once. Here is where things become interesting.

I believe that the Nook may very well relive the fate of Microsoft’s Zune, which allowed users to exchange songs via a WiFi connection – with a play count strictly limited by DRM hardware, even under protest of the copyright owner (say, for files licensed under Creative Commons.) I cannot help but suspect that this ill-conceived anti-feature contributed to the Zune’s unimpressive sales. A feature that is prominently crippled is worse than a nonexistent one, in that users are made vividly aware of frustrated possibilities – all the more so when the prohibited act is one which is entirely traditional with respect to the electronic medium’s low-tech predecessor (whether it be CDs or dead trees.) The Nook’s lending mechanism is an ill-conceived attempt to mimic the behavior of physical books – no doubt in hopes of persuading customers to pay a physical book’s price for mere bits. The latter seems to be an incurable, lethal (witness NuvoMedia plus a parade of other corpses) obsession of ebook publishers.

My prediction: the best-case scenario from B&N’s point of view would be that users simply forget that the lending mechanism exists at all. If, on the other hand, large numbers attempt to use it, waves of frustration will spread. The odiousness of a DRM restriction is not proportional to the absolute amount of freedom it removes; rather, it is a function of just how often and how painfully it thwarts a previously-commonplace (or otherwise natural) act which occurs regularly to most users (in this case, the dastardly deed of lending out a book more than once in its lifetime.) If DRM vendors were anything other than snake-oil hucksters, this fact would be common knowledge.

If DRM-crippled e-books were advertised as being exactly what they are – cheap, inferior, remotely-censorable imitations of actual books – their existence and growing popularity would not be a cause for concern. However, publishers understand that the freedoms traditionally enjoyed by book owners (such as the freedom to lend without restriction) will ultimately lead to the collapse of their business model – and so, they will persist indefinitely in their attempts to make water not wet. I invite the uninitiated to explore what the act of reading would look like were these freedoms to be lost entirely. (When the latter piece was written, the now-commonplace DRM-laden single-use textbooks were still a dystopian fantasy. Students – the perfect captive audience – are the canary in the copyright coal mine.)

Posted in: Distractions, Hardware, NonLoper, books by Stanislav No Comments

Secrets of the Symbolics Console: Part 2

Let’s take another look at the console. There are several boards inside, but this is the only one which deals in custom Symbolics protocols (as opposed to the widely-known intricacies of operating a black-and-white CRT.)

console controller board

The rough annotations are my own. Click on the pictures for super-size (~10MB!) images.

Once again, the Phase Encoded Video decoder board:

labeled PE decoder board
A: 100131 – Triple D-type Flip-Flops
B: 100102 – Quint 2-Input OR/NOR Gate with Common Enable
C: 100131 – Triple D-type Flip-Flops
D: 100107 – Quint Exclusive OR/NOR Gate
E: 100141 – 8-bit shift register
F: 100114 – Quint Differential Line Receiver
G: 100141 – 8-bit shift register
H: 100131 – Triple D-type Flip-Flops

The labeled chips are Emitter-Coupled Logic (ECL.) This explains the frequency of the video signal – 160MHz, Manchester-coded (80MHz data and clock) an astounding one for any entirely digital process happening in a machine of this vintage.

Now for the sad part: this board is hot-glued to its moorings in several places. Naturally, I could tear it loose, but I imagine that it was secured in this way for a reason. I would prefer to leave it in place, to ensure a working console in the immediate future. And so for now, my reverse-engineering efforts will focus on the transmission line (which I have been spying on through the console’s video repeater port) and the video card of the 3620 machine itself.

Let’s open up the latter. The densely-packed internals look nothing like those of any PC:

The closed portion of the chassis conceals the (full-height ESDI) disk and the Lisp Machine’s massive, exceptionally hungry power supply.

The console I/O board (which I have barbarously called a “video card”) is obscured beneath the rainbow cable visible on the upper left.

Let’s pull it out:

To be continued…

Secrets of the Symbolics Console: Part 1

The machine does indeed power up and run:

genera hello

But this is not enough.

The console is a museum piece. While a Lisp Machine circa 1986 might last for a reasonably long time between repairs, a CRT of the same vintage likely will not. Moreover, it is a pain to have around, even if it were indestructible. Wouldn’t it be nice to have a box which replaces the monstrosity entirely, with jacks to connect a standard VGA monitor, PS/2 mouse, and the beautiful Symbolics keyboard?

This promises to be less than trivial, however.

Here is what we find inside the console:

console top

Let’s examine the console cable:

1.  XMIT- Digital Audio serial data from system to the console
2.  XMIT+ Digital Audio serial data from system to the console
3.  TXD-  Biphase serial from system to console (console serial port)
4.  TXD+  Biphase serial from system to console (console serial port)
5.  RXD-  Biphase serial data from console to system (keyboard)
6.  RXD+  Biphase serial data from console to system (keyboard)
7.  RCV-  Audio Clock
8.  RCV+  Audio Clock
9.  Phase Encoded Video
10.  Video Ground
11.  Serial Ground
12.  Ground
(source)

Hmm, “Phase Encoded Video.”
The single extant repair manual tells us (p. 94-95) where to find the decoder board:

console side

The computational equivalent of three or four Commodore-64 machines languishes here.  There is even a set of debugging toggles and associated LED indicators.  One toggle is labeled “RUN/STOP.”

A closer look at the Phase Encoded Video decoder daughterboard:

So what is “Phase Encoded Video”?  Just another name for Manchester encoding, apparently.
And what does it look like?

My puny 275MHz non-storage scope (circa 1979) groans:

wave

To be continued…

“Lisp, Lisp, Lisp Machine, Lisp Machine is Fun!”

bolix2
bolix3