Heathkit ET-3400 projects

Description:

This page lists various projects and activities related to my experiments with my Heathkit ET-3400 and ET-3400A microprocessor trainers. If you're interested in the ET-3400, be sure to look at my first link below, as there are plenty of pictures and a couple videos of the ET-3400 and ET-3400A in action.


1Hz mystery solved

2011-02-03

In the retrochallenge, I fixed the 1Hz signal for the ET-3400. It needed a new quad-comparator chip. Originally, it was a LM2901N, but I replaced it with a LM339. The typical way to look at the output of a signal is to connect a wire to one of the LED inputs. When I did that, the period and duty cycle seemed way off, 26 per minute and on for about 80%, off about 20%. I noticed that the same behavior on the ET-3400A, so I just ignored it for later.

It turns out the the issue here is a measurement problem. The 1Hz signal uses RC-based timing on the quad comparator. The inputs to the LED have a 8200 ohm pull-down resistor. That affects the timing and duty cycle of the 1Hz signal. If you take the output of the 1Hz signal, throw it into a TTL gate first, such as a 7404 inverter, then look at the output, it's much closer to 1Hz. I did this and the frequency seems to be about 80 in 60 seconds, and very close to 50% duty cycle. It's good for a nice slow pulse, but it's not good for anything close to 1.0000 Hz.


New version of the asl assembler

2011-02-03

In the retrochallenge, I found the asl assembler and compiled it on my Mac. Overall, I'm extremely happy with this assembler. It made my life much easier while messing around with the ET-3400/ET-3400A. It does have some quirks, though.

The asl assembler is a C port of a Pascal program that the author did in the mid '90s, I think. It's all open source, however the code is a mess. Perhaps if I look at it for a while longer I'll get used to it. But because it's a translation from an old Pascal program, there's stuff in there like this:

#define BEGIN {
#define END }

#define AND &&
#define OR ||
#define NOT !

#ifndef False
#define False 0
#define True 1
#endif

#define Nil NULL

The code is littered with BEGIN and END, pascal style. It's no longer Pascal, and it's not C. Ugh. But it works quite well.

I still haven't gotten the listing control to work. There's a command-line switch to enable/disable various portions of the listing: turn on/off the symbol section, line numbers, etc. So far, nothing I've tried has had any effect on the listing format.

For my final demo I used some of the macro looping features, and that's when I ran into a real bug. Look at this segment:

 AS V1.41r8 - source file macro.asm - page 1 - 2/3/2011 18:00:51


       1/       0 :                     	outradix	10
       2/       0 :                     
       3/       0 : =$0                 t	set	0			; for t=0 to 135 step 45
       4/       0 :                     	while	(t <= 135)
       5/       0 :                     
       6/       0 :                     	fcb	"\{t}"
       7/       0 :                     	
       8/       0 :                     t	set	t+45
       9/       0 :                     	endm
       5/       0 :                     
       6/       0 : 30                  	fcb	"\{t}"
       7/       1 :                     	
       8/       1 : =$2d                t	set	t+45
       5/       1 :                     
       6/       1 : 34 35               	fcb	"\{t}"
       7/       3 :                     	
       8/       3 : =$5a                t	set	t+45
       5/       3 :                     
       6/       3 : 39 30               	fcb	"\{t}"
       7/       5 :                     	
       8/       5 : =$87                t	set	t+45
       5/       5 :                     
       6/       5 : 31 33 35            	fcb	"\{t}"
       7/       8 :                     	
       8/       8 : =$b4                t	set	t+45
       5/       8 :                     
       6/       8 : 31 38 30            	fcb	"\{t}"
       7/       b :                     	
       8/       b : =$e1                t	set	t+45
      10/       b :                     

Excuse me? Is that a "180" (31 38 30) there in my loop that was supposed to end at 135? It was this bug that caused me to use the "rept" macros instead of the "while" macros in the final demo in the retrochallenge.

Early on in the retrochallenge when I found the asl assembler, there was the "last stable" version and the current "beta" version. I chose the last stable version, v1.41r8, which according to the web page was released in 1999. The last "current version" was listed as 2006, but the download page called it beta, so I didn't want to mess with it at the time. After the retrochallenge was over, I decided to take a look at the current version, and it turns out this software is still being actively developed. Last version was in December, 2010. He's abandoned the versioning scheme he had on the web page and just goes by beta build number. Anyway, now that I'm running the new version, you can see an improvement.

 AS V1.42 Beta [Bld 79] - source file macro.asm - page 1 - 2/3/2011 21:16:09


       1/       0 :                     	outradix	10
       2/       0 :                     
       3/       0 : =$0                 t	set	0			; for t=0 to 135 step 45
       4/       0 :                     	while	(t <= 135)
       5/       0 :                     
       6/       0 :                     	fcb	"\{t}"
       7/       0 :                     	
       8/       0 :                     t	set	t+45
       9/       0 :                     	endm
       5/       0 :                     
       6/       0 : 30                  	fcb	"\{t}"
       7/       1 :                     	
       8/       1 : =$2d                t	set	t+45
       5/       1 :                     
       6/       1 : 34 35               	fcb	"\{t}"
       7/       3 :                     	
       8/       3 : =$5a                t	set	t+45
       5/       3 :                     
       6/       3 : 39 30               	fcb	"\{t}"
       7/       5 :                     	
       8/       5 : =$87                t	set	t+45
       5/       5 :                     
       6/       5 : 31 33 35            	fcb	"\{t}"
       7/       8 :                     	
       8/       8 : =$b4                t	set	t+45
       5/       8 :                     
      10/       8 :                     

The loop stops at "135" (31 33 35) as it should. I still haven't gotten the listing control to behave as I expect, but I'm sure it's still just operator error.


Monitor using the LCD

2011-02-02

I've been thinking it would be cool do have the ROM monitor operate on the LCD instead of the LEDs. It could have the "CPU UP" and all that right on the LCD. I've started by getting the code for the ET-3400 Monitor Rom. The et-3400 yahoo group files section has it available. With a few simple modifications, it builds in the asl assembler.

The main issue is how to get to the "reset" entry point in my monitor? It's too early to remove the real rom monitor, so the ROM is still there and always directs the Reset vector to $FC00. There's nothing I can do about it. However, I can use the NMI signal as a sort of Reset to get into my own Monitor.

So I rebuilt the monitor with a new origin so that it runs in the additional RAM I added during the retrochallenge. I changed the "CPU UP" to be "cPU UP", put a jump to reset vector into the place where the real rom monitor vectors the NMI to, and hit the NMI button. I got my "cPU UP", and everything else worked just fine.

There is a problem, I've got an non-bounce-protected button going into the NMI vector. I'm pretty sure it's sending multiple NMIs to the CPU. This is not desirable. I'll have to set up a debouncer on that button.

Next step is to gut the output routines that go to the LED and stick in some LCD ones.


NMI Debounce

2011-02-03

I've got a button going into the NMI line. It's pulled high, and the button grounds it. Well, this scheme sends multiple falling-edges into the NMI line. This is causing more than one interrupt. I set up a simple counter to see how many I was getting, and it was somewhere about 20 interrupts per keypress.

There are several debouncing methods. Since I don't have "software" as an option here, I chose to use a 555 timer to send a one-shot pulse when I hit the NMI button. As long as I have released the nmi button before the pulse is done, I don't get any bounces sent on the way up.

I'll post a schematic when I get a good method.


Ebay purchase: two old boards

2011-02-03

I bought two "for parts" ET-3400A boards off ebay. They do not have the blue-plastic cases. From what I can tell of the pictures, they both have all the keycaps, the RAM, CPUs, two 7-segment LEDs each. Neither one has the ROM. There's only one power transformer. I didn't pay much for the lot. It will be interesting to see what arrives and whether there's any hope these can ever operate again in some form.

2011-02-07

The boards arrived today. They don't seem to be in too bad shape. Clearly, they've been raided for parts. I may be able to get them working. The ROMs are missing, so they need to be adapted for EPROM use which requires a modification because the Motorola ROM pinout is not compatible with your average 2716.

One has an LED missing, and the other has green LEDs where I usually expect red ones. Green power LED, too. Plus a funny "* cancel" label on the reset key. Both have had their 7-segment LEDs raided. And both look like their dipswitches were actuated by pencil-point. Perhaps these were used in a teaching lab. There's also only one transformer, which is detached. It's actually a transformer assembly, with the output wires severed from the board, the power cord cut off, but the fuse circuit is still there. Most of the other chips are present. Interesting is that the CPUs are 6808's, whereas my reference ET-3400A has a 6802. The 6808 has a little bit of built-in ram which is disabled by the ET-3400A, making it behave just like a 6802.

I figure a good way to get started with these is to start grabbing the components individually and testing them out in my working ET-3400A. I'll also need to make a power connector for them much like I did for the ET-3400 in the retrochallenge. I'll check out basic power connections, then I guess the acid test is to populate them with all known working parts and see how it goes. Then decide what to do from there. I'll need a good mounting solution at some point.

Another interesting thing is that to examine these boards, it's easier for me to look at the hi-resolution photos than to actually go over to the boards and stare at them. The lighting with the camera flash is better than the lighting in this room in general. (Oh, now I see one of them is missing diode D17 adjacent to the CPU.)

A mostly-populated Heathkit ET-3400A board with no case, all keys present, 4 seven-segment displays missing, ROM missing, and 1 of the 8 red indicator LEDs missing

A mostly-populated Heathkit ET-3400A board with no case, all keys present, 4 seven-segment displays missing, ROM missing, and all indicator LEDs present, but they're green instead of the usual red

2011-02-08

I was looking in the "Motorola 8-bit Microprocessor and Peripheral Data" book, and I was mistaken, the 6802 has the built-in RAM and the 6808 does not have it.

Another thing I noticed is the 6802/6808 does not have the tri-state control input. I wonder how you're supposed to do DMA with these parts? The ET-3400A does have a TSC input, but it doesn't seem to do anything to the CPU. Heathkit might have faked it. I'm not likely to be doing any DMA with either of these boards, but it is a mystery.


Schematics for the additional circuits in the retrochallenge

2011-02-06

I wired up quite a bit of stuff to the ET-3400A during the retrochallenge, and I only have vague sketchings of the schematics I used. I should get these posted before they leave my head or I have to tear the circuits apart.

I'll be looking for a suitable schematic capture tool, or maybe just a simple drawing tool.


Gilbert Coville