Tony Duell wrote:
<snip>
   I understand
your confusion here, but in this case there already is something 
 I'm not confused. I know what the terms conventionally mean. I would not
 normally descibe a program running on a microprocessor as 'microcode'
 (for all some books do make that mistake, and DEC even once called
 anything running microcode a 'microprocessor' (like the microcoded comms
 processors they used on things like the DMC and DMR cards) for all they
 were not single-chip processors (which, IMHO is the conventional
 definition of microprocessor).
 I, however, don't see it as necessarily wrong to look at a system at a
 different level... 
 
Ok, so normally code running on a microprocessor is 'not normally' described as
microcode.  Lets start from here....
<snip>
  OK, now replace that Pentium chip with an ARM (which
contains no internal
 microcode). Is the emulation firmware in ROM now ARM machine code, or
 microcode, or both (I would claim it could be considered to be both). 
Ok, so now we have code running on an ARM microprocessor, a non-microcoded
architecture.
So now why would it be correct to call the program running on a non-microcoded
microprocessor, "microcode"?  Clearly on a non-microprogrammed machine, there is
no
microcode.  So does choosing a different name suddenly turn the ARM inso a microcoded
architecture?
Very clearly it does not.  So simply choosing to use terms to describe totaly different
levels of hardware abstraction is not such a good idea.
  Let's suppose I make a PDP11-compatible CPU by
using a Pentium (or an
 ARM), that firmware emulation machine/micro code and the memory interface
 as I've described. To the _user_, that's a processor that runs PDP11
 machine code programs. I could boot RT11 or RSX on it. Inside there's a
 program that controls the operation of that PDP11-compatible processor. I
 think it's justified to call that microcode under some circumstances, and
 Pentium/ARM machine code under others. 
This is called emulation, not microcode.  Otherwise your application gets to define a
processor as microcoded or not.
I think the problem here is that your describing an assembly level program which performs
a
similar function to the actual microcode in say, a PDP 11/45.  But performing the same
function on a different machine already has a term, its emulation.
Emulation is simply not microcode, and its not correct to describe it as such.  Try
bending
terminology like this on your resume some time, and see how the industry reacts.
   The code in
the ROM is still made of instructions which are interpreted by existing
 microcode.  The difference is very very clear at the hardware level. 
 Not to me it's not. In fact I'm looking for an unabiguous distinction
 between microcode and a finite state machine. I know what both of them
 are (having designed both on many occasions) and as far as I can see
 there is little electronic differece between them. 
 
Back up for a moment, and look at the application your suggesting here.  An assembly level
program, running on a microcoded machine, emulatating another processor.
So  now you replace the microcoded processor with a non-microcoded one, and still claim
there is microcode present?
  Suppose you have a circuit. It consists of an N-bit
latch, outputs to
 some combinatorial logic circuit (which we can, of course, make from a
 ROM). The combinatorial circuit has other inputs from the rest of the
 system. Outputs of the combinatorial circuit go to to other parts of the
 system (to control it) and also back to the inputs of the N-bit latch.
 Now, that, of course, is a classic finite state machine. But hang on a
 second. Suppose the 'other' inputs to the combinatorial circuit come from
 the machine code instruction latch in a processor. The outputs control
 the ALU, data path muxes, and so on. Then it certainly looks like
 microcode to me. 
Not at all!
Processors that use this design method are quite common.  Usually there are state and
cycle
counters.  Combinatorial logic is used to decode the instruction register, state and cycle
counters to drive the control signals for the CPU logic.
This is NOT microcode.  This is a non-microprogrammed machine.  An example of this is the
good old 8080.  Contrast this to the design of the Pentium or other microprogrammed
design.
The presence of a control store eliminates all that combinatorial logic.
I reccomend you get a copy of Mick and Brick, Bit Slice Microprocessor Design.
An excellent book, it even has plans for a PDP-11 emulation with 2901's.
<snip>
  Let me start with a somewhat silly example.
 I need to make a circuit that outputs an incrementing 8 bit binary
 number. I decide to do it in a somewhat odd way (for no good reason other
 than I'm eccentric).
 I decide to use a Z80 processor. And to write a little program to output
 an incrementing count to an output port. I map an 8 bit latch at that
 output port address, and use that as my 8 bit output. 
<snip>
 (Apologies for any bugs in that, but you should get the idea).
 OK, so far so good. It is clear that the contents of that ROM are
 firmware/software (in this case Z80 machine code).
 But as a hardware designer, I can regard that ROM as a programmable
 combinatorial circuit (in fact it's really a fixed AND matrix followed by
 a programmable OR matrix). So I can write a logic equation for each
 output bit of the ROM, in terms of the address inputs. 
Understood.  But look at the complexity of altering the actual combinatorial logic
and the firmware.  Clearly the firmware is much more practical to alter, and this
is why microprocessors are so popular.
But this, as you say, it still Z80 machine code.  Inside that Z80 there are huge
areas of combinatorial logic that decode the instruction register, cycle and state
counters
to drive the control signals for the CPU logic.  (the Z80 is not microcoded either)
If you replaced all that combinatorial logic with a ROM, the contents of that ROM (no the
physical ROM itself) would become microcode.
So its not the gates, its the logical expressions they encode, and its a full layer of
complexity below Z80 machine code.
<snip>
  I now take some TTL gate chips and wire up circuits to
implement them.
 And replace the ROM with those circuits (as I said, I'm eccentric).
 The system still works as it did before. The Z80 sees the same
 instructions....
 However, it's not at all clear to me that the gates wired up like that
 should automatically be called 'firmware' even though they replaced a ROM
 contianing firmware. And if they should, is there a clear test to
 determine when a mass of gates is to be called 'firmware'? 
See above.
   like the
AM2910 microprogram sequencer.
 So the presence of state machines (you can't run microcode without them!) is not
 an issue here. 
 Actually, I am sure it's possible to make the control system of a
 processor where the only state machine is the combination of the
 microcode address latch and the microcode PROMs. There need not be other
 state machines 'below' the microcode. 
 
Correct.  And the contents of the PROMs is the microcode, not the PROMs themselves, as
described above.
<snip>
  OK, getting back to the original PDP11 emulator, why
can't we call
 Intel's microcode in the Pentium 'nanocode', the emulator firmware
 'microcode' and the user's PDP11 program 'machine code'? 
Because its basically the same thing that other manufactuers call microcode, and
being its Intel's processor, they get to make these choices.
You can choose to redefine all the terms you like, but that does not make your
usage correct, or more correct than the acutal manufactuers terms.
   Basically, if
a machine is already microcoded, the term is already taken. 
 Ah, so if somebody has already claimed something to be microcode, then
 that's what it is, and we can't consider it as something else. Odd.... 
 
Not odd at all, the manufactuer is using terminology in a standard way so that it is
clearly
understood by the industry.
<snip>
   But I still
cannot call this binary program 'microcode' on the 2114 simply because the
 2114 is not microprogrammed. 
 True enough (otherwise, as I said a couple of messages back we'd have the
 absurd situation that the same program would be microcode on a P850 [1]
 and machine code on a P851 [2]) 
 
Ok, so then running a PDP-11 emulation on an ARM would be...
A, Emulation.
B, Emulation.
C, Emulation, or
D, Microcode, because I feel like calling it that.
<snip>
  Sure.... But I am now looking for an unambiguous test
(note : Not 'this
 is what it's normally called') to distinguish between the microcode in a
 microcoded processor (which interprets user machine code instuctions and
 controls the data path, etc in the processor) and what would normally be
 called 'an emulator' running on a RISC processor (with no internal
 microcode) that interprets the intruction set of another processor (here
 the PDP11) and also 'runs directly on the hardware'.
 -tony 
Its all about how its implemented.
If the machine level instruction set of a processor is implemented with fixed,
combinatorial
logic as opposed to a stored 'microprogram', its not a microprogrammed design.
If you then use the machine code for that machine to emulate another processor, you are
writing an emulator.  The machine code may, or may not be microprogrammed, it makes no
difference in this case.
If you alter or create the microprogram of a microcoded processor to emulate another
processor, you are writing microcode, and an emulator at once, your actually writing the
emulator in microcode.
But this is not what was proposed at all.  What was proposed was writing an emulator in
machine code, on an already microprogrammed processor, and calling the result
'microcode'.
This appears to be totally unambiguous, unless I missed something.