[HN Gopher] Tracing the roots of the 8086 instruction set to the... ___________________________________________________________________ Tracing the roots of the 8086 instruction set to the Datapoint 2200 minicomputer Author : matt_d Score : 56 points Date : 2023-08-12 17:41 UTC (5 hours ago) (HTM) web link (www.righto.com) (TXT) w3m dump (www.righto.com) | rep_lodsb wrote: | Great article, especially the opcode charts! Almost all you find | online are unfortunately in hex, which obscures the encoding. | | The strangest feature inherited from the 8008 is probably the | parity flag. There are some uses other than 7-bit ASCII comms for | it, but this kind of code is probably heavily 'pessimized' on | modern CPUs: TEST AL,0xc0 JZ | quadrant0 ;both bits clear JPE quadrant3 ;both | bits set JS quadrant2 ;only bit 7 set JMP | quadrant1 ;only bit 6 set | | And to this day, even the reserved lower flag bits have the same | values as they did on the 8080 ('S Z _0_ A _0_ P _1_ C '). I | wonder if there is actually code out there that depends on bit 1 | being set. | | One nitpick: | | >The ModR/M byte has been changed in 64-bit mode so the BX | (originally HL) register is no longer special when accessing | memory | | It was 32-bit mode that made EAX, ECX and EDX usable for | addressing, though not the 16-bit lower half registers. And | nothing with that changed in the transition to 64 bits. | kens wrote: | Thanks, I've fixed that. | kens wrote: | Author here if you have questions about the Datapoint 2200 :-) | adrian_b wrote: | No questions, just thanks for another interesting article. | | What I have found especially interesting is the story about the | undocumented instructions of 8085, because I was not aware of | them. | | Those instructions would have been actually quite useful and if | they had been documented they would have made the Intel 8085 | significantly more competitive with Zilog Z80, taking into | account also the fact that in the early years 8085 usually had | a higher clock frequency (3 MHz or 5 MHz for 8085 versus 2.5 | MHz or 4 MHz for Z80). | | When I was young I have worked to make some improvements in | speed to the functions that implemented the floating-point | arithmetic operations in the run-time library used by the | Microsoft CP/M Fortran compiler, because they were too slow for | my needs (obviously after disassembling them, as Microsoft did | not document them). On an Intel 8080 CPU, more than 100 FP64 | multiply-add operations per second was considered as high | speed, while now a CPU that does 100 billion FP64 multiply-add | operations per second is considered a very slow CPU (the best | desktop CPUs are more than 6 times faster). | | I am sure that with the extra 16-bit operations provided by | 8085, a decent speed-up of those FP arithmetic functions would | have been possible and I would have found that useful at that | time, because I was able to use IBM PC clones only some years | later. | canucker2016 wrote: | Was the datapoint 2200 a brand new machine or was it influenced | by others esp. wrt. the assembly language instruction set? | | Looking up Datapoint on Wikipedia shows a predecessor box, the | 3300. But did the new designers of the 2200 totally ignore the | 3300 instruction set? The 3300 seems to have used shift- | registers as well. | | Other data terminals at that time or radio equipment these | designers might have used before? | | Thx | | https://en.m.wikipedia.org/wiki/Datapoint | https://en.m.wikipedia.org/wiki/Datapoint_3300 | kens wrote: | The Datapoint 3300 was strictly a terminal. It was not | programmable and did not have an instruction set. It | basically had counters for the cursor position and put | characters into memory at that position, and had a ROM to | generate characters. Manual: http://bitsavers.org/pdf/datapoi | nt/3300/70116_3300termMaint_... | | I don't think the Datapoint 2200 had any specific influences, | at least none that I could find. Keep in mind that at the | time, it was fairly common to make a processor out of TTL | chips. People would make a custom processor for random things | like a CNC controller or a video game. These processors were | usually ad hoc, with an instruction set that had the features | that were needed. If people were going to copy something, it | was often a PDP-8 or 11 or a Data General NOVA. | pwg wrote: | Ken, you have this statement in a footnote: | | > I haven't been able to find any instruction set before the | Datapoint 2200 that required memory addresses to be loaded into | a register. | | For a direction to look, look at the CDC mainframes (the | Cybers, the 6600 and 7600 models, and possibly earlier models). | A too great many years ago now while in college for my EE | degree the college had a pair of CDC's (I think a 6600 and | 7600, I only ever had access to the older one for a mandatory | "assembly programming" class) and one of the 'quirks' of the | CDC CPU design was that the CPU had (if memory serves) eight | data registers and eight address registers, and to perform a | memory read, one loaded an address into one of the first six | address registers, which would cause a memory read from that | address, storing the result in the corresponding data register | (so A0 caused a read into D0, etc.). | | For a memory write, one loaded an address into either A6 or A7, | which caused the CPU to perform a memory write using data from | the corresponding data register (A7 caused D7 to be written to | memory). | | The "production dates" for these CDC systems is relatively | contemporary (for a reasonable fudge factor around | "contemporary") with the Datapoint terminal, so these might be | an example of another architecture from a similar time range | (or quite possibly before) that loaded an address into a | register in order to access memory. | kens wrote: | Thanks, that's very interesting and I've updated the | footnote. I looked at the CDC 6600 manual and it works pretty | much like you say. If you change an address register A1-A5, | the system automatically reads from memory into the | corresponding operand register X1-X5. Similarly, if you | change address register A6 or A7, the word in X6 or X7 is | stored to memory. It is interesting to look at old systems | that do things wildly differently from modern computers. | | http://www.bitsavers.org/pdf/cdc/cyber/cyber_70/60045000_660. | .. | adrian_b wrote: | > I haven't come across an instruction set other than | Datapoint that treated register and memory accesses | identically. (If you know of exceptions, please let me | know.) | | The DEC PDP-11 was launched in 1970, slightly earlier than | Datapoint 2200. | | While DEC PDP-11 also had additional addressing modes, its | two most simple addressing modes, register direct and | register indirect correspond exactly with the addressing | modes of Datapoint 2200. | | The only difference is how they were encoded. Because | PDP-11 had longer instructions, they could afford separate | bits for encoding the addressing mode. | | So 3 bits encoded the 8 registers and a separate bit | encoded whether the register is used as data (register | direct) or as the address of data from memory (register | indirect). | | Datapoint 2200 needed shorter instructions, so they have | dispensed with the bit needed for encoding the addressing | mode, by using only 7 registers, so that the unused | register number could be used to encode the register | indirect addressing mode, where the register holding the | address had to be implicit, as no other bits were available | to specify it. | | So what is special about the addressing modes of Datapoint | 2200 is this encoding trick, which saves 1 bit of the | instruction encoding with the price of allowing only one of | the general-purpose registers to be used for memory | addressing, while the addressing modes themselves are not | new. | | This encoding trick, where it is avoided to have additional | bits for encoding addressing modes, by reserving some | register numbers to encode those addressing modes, has been | reused repeatedly by Intel when defining the 8086 and 80386 | ISAs and by AMD when defining the 64-bit extension. | | For instance, there are no instruction bits to encode | addressing modes where the address is computed by adding a | base register and an index register. Instead of that, the | SP register cannot be used in the basic encoding for memory | operands, so using the SP register number denotes that the | address is computed by adding a base register and an index | register, where those registers are specified by an extra | SIB byte. There are a few other cases where some registers | cannot be used with certain addressing modes, but when they | appear in the instruction those register numbers mean that | the operand must be accessed with some different addressing | mode, like memory relative to the instruction pointer or | memory absolute. | rep_lodsb wrote: | In PDP-11 terms, the Datapoint 2200 only had these | "address modes" ( https://en.wikipedia.org/wiki/PDP-11_ar | chitecture#General_re... ): - register | - register deferred via HL - autoincrement via PC | (immediate operands) | | No registers other than HL and PC could be output to the | address bus at all. The 8080 was _much_ more flexible, | but the instructions it added weren 't orthogonal, so I | would say it's not at all comparable to the PDP-11 | addressing modes. | Animats wrote: | The CDC 6600 did that for a completely different reason. It's | an early superscalar machine. It overlaps memory operations, | and even some compute. This is visible to the programmer. The | desired programming style is load, load, load, operate, | operate, operate, store, store, store. Then the operations | can overlap. There's something called the "scoreboard" to | stall the pipeline if there's a conflict, but there's no | automatic re-ordering. | | The tiny machines at the Datapoint 2200 and 80xx level didn't | do anything like that. | | At the other extreme, there were low-end machines where the | registers really were in main memory. The compute/memory | speed ratio has changed over time. Today, arithmetic is much | faster than memory, but in the late 1960s/early 1970s, | arithmetic was often slower than memory on low-end machines. | AlbertCory wrote: | hi Ken! | | I wrote about DataPoint in _The Big Bucks_. It turns out I knew | Gordon Peterson, architect of ARCNet, so he was a very good | source for me. | | Naturally, there's a book about them. I read these things so | you don't have to. | Hizonner wrote: | Lessons learned: | | 1. Incremental, backward compatible progress wins in the market. | | 2. Incremental, backward compatible progress leads to nasty, | ugly, hard to use hacks that create waste, inefficiency, and user | pain. | | Explains a lot, really. | kens wrote: | As Intel engineer Tom Forsyth said, "The REAL cost of x86 | legacy is not gates, it's lots and lots of meetings." | rob74 wrote: | _Remarkably, Intel has managed to move from 8-bit computers to | 16, 32, and 64 bits, while keeping systems mostly compatible._ | | Well, the move to 64 bit didn't quite turn out as Intel wanted | it, and they had to copy AMD's version of it. This is | acknowledged in footnote 20, but the article itself sounds like | Intel was infallible and never mentions AMD at all... ___________________________________________________________________ (page generated 2023-08-12 23:00 UTC)