andrew@orca.UUCP (07/04/83)
I can't believe that people are holding up the NOVA instruction set as a design to be emulated! This is the machine where you cannot cram a 16-bit address into any sort of instruction; the most you have are four flavors of short displacements: relative to either of two registers, relative to PC, or located in low memory ("page zero"). The convolutions you have to go through to write (or generate) machine code are painful. You want to call a distant subroutine? Plant a pointer to it, somewhere close to your "call" instruction, and do an indirect reference. Duplication of commonly-used constants is rampant because you can only refer to constants within plus-or-minus 128 words. Addresses refer to 16-bit words, rather than to bytes. At first glance this looks like a trade-off of byte-addressability for a double-sized address space, right? Nope, addresses are *fifteen* bits wide ... the high bit of a sixteen bit word is ignored (at east on the original NOVA design). Sure, a horizontal instruction set looks elegant, but just try writing a code generator when you have a flock of users who want absolutely optimal code. The complexity of the task is exponential with the number of independent operations which a single instruction can perform. Give me an 8080 any day! -- Andrew Klossner (decvax!teklabs!tekecs!andrew) [UUCP] (andrew.tektronix@rand-relay) [ARPA]
wmb@sun.UUCP (Mitch Bradley) (07/15/83)
Another interesting "feature" of the Nova, as I recall, was related to the indirect bit in Nova addresses. It seems that if you constructed an address pointer that pointed to itself, and also had the indirect bit set, then the machine would go into an infinite loop that could only be terminated by turning off the power. Also a->b->c->....->a would accomplish the same effect.
padpowell@wateng.UUCP (PAD Powell[Admin]) (07/16/83)
Sorry to disapoint you, but the indirect loop terminated after 2 seconds. This was done with a resistor and capacitor... I fondly recal a hardware fault where indirection failed, and the repair man (Long before the days of CE's) replaced it... Sigh... Those were the good old days when Real Programmers could toggle in the bootstrap from memory... Patrick ("Sigh. Paper Tape Operating System??? The last USENIX conference seems to indicate UNIX will be the first Red Tape and Blue Suit Operating System") Powell
guy@rlgvax.UUCP (Guy Harris) (07/17/83)
UNIX the first "red tape and blue suit" operating system? If you mean "the first operating system where you have to deal with lawyers and marketers and bureaucracy to get it", not by a LONG shot. For all the bitches about the problems that come with UNIX's commercial maturity, it's still not noticably worse than the vast bulk of OSes out there. Guy Harris {seismo,mcnc,we13,brl-bmd,allegra}!rlgvax!guy
fuka@parsec.UUCP (07/19/83)
#R:orca:-135800:parsec:32800002:000:1047 parsec!fuka Jul 11 16:12:00 1983 As a former programmer for Data General, I agree with most of what orca!andrew has to say about the Nova. It WAS a real pain to write software for, but the simple architecture made it cheap to produce out of TTL in those days, which made it cheap to sell. Just like the RISC, it was also fast (for the times) because it was such a simple instruction set to decode. If you think about the concepts in RISC, the Nova was actually a pretty far-sighted machine. That doesn't mean that I'd ever want to program one again, however. One minor point: The sixteenth bit of Nova addresses WAS used -- it was an indirect bit, which allowed for n-way indirection of memory references. Any indirect reference which found an indirect pointer which had this bit set would cause a second level of indirection. Some knock-off Nova manufacturers (AMPEX?) used this 'extra' bit to implement a doubling of the address space (but only through indirect addressing). Kent Fuka Parsec Scientific Computer Corp. {allegra|ihnp4|uiucdcs}!parsec!fuka
nather@utastro.UUCP (07/21/83)
I can't believe that people are holding up the NOVA instruction set as a design to be emulated! * * * * Addresses refer to 16-bit words, rather than to bytes. At first glance this looks like a trade-off of byte-addressability for a double-sized address space, right? Nope, addresses are *fifteen* bits wide ... the high bit of a sixteen bit word is ignored (at east on the original NOVA design). The high bit is not ignored; it is used as an indirection flag so that a 15 bit value in memory can be designated as either a direct address (high order bit zero) or an indirect address (high order bit 1). This allows multiple indirection, which an assembly-language programmer can use to good advantage, and which a code generator cannot. Sure, a horizontal instruction set looks elegant, but just try writing a code generator when you have a flock of users who want absolutely optimal code. The complexity of the task is exponential with the number of independent operations which a single instruction can perform. Give me an 8080 any day! -- Andrew Klossner (decvax!teklabs!tekecs!andrew) [UUCP] (andrew.tektronix@rand-relay) [ARPA] Here is the crux of the matter. A single arithmetic instruction on a nova consists of five (5) separate, sequential operations: set the carry (0, 1, ~, or NOP), do the operation (add, subtract, complement, etc), shift the result (0 or 1 bit position), test the result (value or carry), then save the result (in a register) or discard it. It takes a while to adapt to this sequence, and most programmers find it awkward to start. With practice and experience, though, it becomes possible to write short, compact and efficient code, using very few instructions. It tastes a lot like C, where a single statement can do several things at considerable savings in time and clutter. Designing a code generator is something else entirely. An experienced Nova programmer can adapt to this sequence and write fast code, but a compiler (for any langauge) really can't, and the addressing limitations compound the problem. Compiled code is bulky, inefficient and slow. Example: the "Sieve" program, written in "hand-honed" assembly language, takes 1.3 sec on a Nova 3. The same program compiled from Fortran code (pinched from "Byte") takes 22 times longer on the same machine. In my opinion, the Nova architecture is a fully-matured example of an instruction set designed for effective assembly-language programming, and as such is both elegant and passe. It is an architecture whose time has come and gone, like the drum-memory machines of yesteryear. Onward into the fog! Ed Nather ...ihnp4!kpno!utastro!nather