On Thu, 8 Sep 2011 21:03:24 +0100 (BST), ard at p850ug1.demon.co.uk (Tony
Duell) wrote:
That/'s why, incidentally, in a couple of
days time I am demonstating
a printer that's almost 40 years old, taking it apart to show the
internals, nnd describing the intricacies of the control system (it's
beautiful, and to think the ROM is only 32 bytes long...)
Please tell us which one
:-)
Sure, it;s the HP9866A
As a bonuis, now that I've given the talk, I'll reveal all. Together with
the HP docuemtnation and the scheamtics, this should explain how it works
:
HP9866 Control State Machine
----------------------------
** Character Entry **
00 : 20 if(Stb/) goto (00,02) , ClrFlg
Start of main loop (also entry point on power on). Clear interface flag
(not busy) Wait for strobe pulse on interface
02 : 2B goto (06)
06 : C2 if(PrtChar) goto (12,11) , InClk
Load chracter into input register, set interface flag flip-flop
(indicating printer busy). Test if it is a printable character (including
linefeed). If not, ignore it.
12 : F4 if(LF/) goto (19,1B)
Is it a linefeed?
1B : CF if(Empty/) goto (17,15)
Input character is a linefeed. Is the line buffer empty? If so, just feed
the paper, if not, do a full print cycle.
19 : C1 if(Start/) goto (14,11)
It's not a linefeed. Is the line buffer full (that is character counter = 0
and empty/ flip-flop set). If so, ignore it (truncate the line)
14 : 9D goto (0D) , SClk
Line buffer is not full, store new character in the shift register
0D : C4 goto (11) , PHOut
Increment the character counter, set empty/ flip-flop, and end this character
11 : C0 if(Stb/) goto (10,11)
End of character processing. Loop until strobe is inactive
10 : 00 goto (00) , ClrFlg
Clear interface flag and round again.
** Print cycle **
Now to actually print a line. Begin by filling the unused space in the data
shift register with spaces
17 : 89 if(Start/) goto (04,05) , ForceSpace
Set the data input flip-flops to a space character. Exit from loop when the
line buffer is full (effectively a while(buffer not full) loop).
04 : 10 goto (08) , SClk
Load a space into the next buffer location
08 : EF goto (17) , PHClk
Increment character counter and round again.
The line buffer is now ready, so print it.
05 : E6 goto (13) , Autofeed
Advance the paper one dot line
13 : E3 if(Timing) goto (16,13)
Loop until U26b times out to give the motor time to move
16 : 3E if(Row7) goto (0B,0E) , InClk
Is this the end of the printed character (7 rows of dots printed)? If so,
goto the paper feed routine, starting by incrementing the row counter.
0B : 7B goto (1E)
1E : 84 goto (01) , RowClk
Increment row counter. This also controls the RotEn line so as to go into
printing mode
01 : 50 goto (18)
18 : BF goto (0F) , PHClk
Clock the 5 bits for the current row of the current character into the
printhead shift registers.
0F : DA if(char0/) goto (1A,1D)
Is the line completed? This will skip the 4-chracter rotation at the end
of the complete print line, so as to leave the line buffer in the same
state at the start and end of a line. Thus each row of dots comes from
the same chracters in the same positions.
1A : AF goto (07)
07 : 59 goto (1C) , ForceSpace
No, start to roate the line buffer by 4 characters. Now ForceSpace/ had a
second meaning. It increments the '4 character' counter U17a/b
1C : A7 if(LnFlg) goto (07,03) , SClk
Rotate the line buffer and round again if it's not been done 4 times
(print every 4th character on each pass)
03 : D8 if(newbank/) goto (18,1D)
Has a complete bank been loaded? If not, go back and load the next
character.
1D : 32 goto (0A) , PHOut
A complete bank has been loaded, so trigger printhead timing monostable
and print this bank of dots.
0A : 31 if(Timing) goto (0C,0A)
Wait for U26a to time out (this bank has been printed).
0C : 8C if(firstbank/) goto (01,05) , SClk
Rotate the line buffer by one character to get the next quarter of a line
into postion. Has the character counter wrapped around so all banks have
been done? If so, back round, advance the paper and start the next dot
line. If not, then round again to start the next bank of data
** Paper feed **
This routine advances the paper by enough dot lines to complete the
character and inter-row space
15 : 94 goto (09) , Autofeed
Clock the stepper motor counter
09 : 93 if(Timing) goto (0E,09)
Loop until monostable U26b times out (to give motor time to move)
0E : FF goto (1F) , RowClk
Increment dot row counter
1F : C5 if(RotEn) goto (15,11)
Round again if dot row counter has not got back to 0 (RotEn = 1).
Otherwise go to end of character processing
You know full
well that financial value is not a reason for collecting
something.
Unfortunately that is not the case for those transatlantic gentlemen
who
spend their time on eBay buying "rare gold computer chips" for insane
amounts of money, driving up the prices for the rest of us :-(
Yes, you're right, there are some people who appear to collect as an
investment. Personally I think there arre safer things to invest your
money in, and I think that classic computer hardware is much more
interesting when it is put into operation.
-tony