Friday, April 17, 2026

Back to the need to load the 1130 SBR card pins the same as my oscilloscope probe

THE WATCHED POT NEVER BOILS - OR IN THIS CASE THE BIT NEVER FAILS

I set up the scope again to watch the exact analog signal occurring when bit 14 fails to set in the most common situation triggering the parity stops while using my 1130 MRAM memory board replacement for the IBM core memory circuitry. I put another on bit 10, which is the other that comes up less frequently. 

Putting the machine in the perpetual Storage Display loop reading all memory locations, I found that bit 14 and bit 10 didn't fail. The machine ran longer until some other bit failed to latch into the Storage Buffer Register (SBR) and the machine stopped. 

Observing the pin with a scope probe seems to stop or greatly reduce the rate of failures occurring for that bit. The 'quantum' behavior where the act of observation changes the results. 

I had tried to recreate the electrical effect of the probe being attached, modeling the oscilloscope probes internal circuitry and applying what should be an equivalent set of components to the pin on the backplane where the sense pulse signal from my board arrives, the other end of the circuit hooked to the ground pin nearby The equivalent circuit did not reduce the failure rates at all. It was NOT equivalent to whatever analog magic happens with a jumper hooked to a probe is attached.

However, I just realized a significant difference exists between my equivalent circuit. When I hook up the four scope probes, the first one which picks up the Parity Stop signal is where I make a ground connection. That signal is in gate B, compartment A1 but the SBR cards where the other probes connect are all in gate B, compartment B1. Thus, the probe hooked to the pin for bit 14 has circuitry through the probe to the scope, but returning out of a different probe to ground on another compartment.

How that impacts the behavior I don't understand, but perhaps I can figure out the way the probe impacts the pin, then recreate the equivalent circuit. 

Fighting with the SLT contacts to solder them onto my 1627 plotter controller card

CONTACTS TURN AND TILT WHILE SOLDERING

I attempted the method of soldering one side using 183 C solder paste and hot air, so that I could add the other side's contacts using lower temp (138 C) paste without dislodging the first set. However, because my pad on the PCB does not match the shape of the contacts, as the solder melts the contacts are free to float and turn. 

I stopped heating the paste after the three rightmost ones melted and moved out of alignment. The left ones moved due to my touching them as I removed the board from the soldering area of my workshop. You can clearly see the square small pads that permit the contacts to move. Normally when a pad and the component are the same shape, the liquid tension of the melted solder will pull the part into perfect alignment. 

PROPER FIX IS REDRAWING THE CONTACTS ON THE PCB

I believe that I must redraw the contact pad on the PCB to match the actual contacts, then remake the board. That should give me the ability to solder these down properly. However, that involves some time, both to modify the KiCAD files, and to approach PCBWAY.COM who sponsored the first run of the boards to request a second build. 

NEAR TERM APPROACH WILL BE A JIG TO HOLD 12 CONTACTS IN PLACE

I have to figure out a jig that I could insert contacts for all 12 positions, hold them in place, set the assembly onto the PCB and then heat the solder paste to melting without destroying the jig. This will be complicated to work out, since the contacts, being springy, won't all have exactly the same shape. However, the jig must hold them so that the bottom contact area will be flat on the PCB in the right location. 

Thus there is a design and manufacturing complexity to such a jig that will hold all those contacts in the proper alignment. It also must not melt at temperatures up to about 200 C. Finally, it must allow the hot air to easily flow around the contact and the PCB so that the solder paste melts and then cools when hot air is removed.

If this is going to take longer than the time to get permission and then receive finished PCBs, it will be moot. Give me a day with my thinking cap on. 

Wednesday, April 15, 2026

Showing redundant wirewrap connection for Sense Bit 14 entering the SBR card

WHY THIS REDUNDANT CONNECTION?


The wire around pin D10 of slot L3 is the one that carries the -Sense Bit 14 pulse from memory into the card that implements bits 14 and 15 of the Storage Buffer Register (SBR). Tracing the wire up to the pins for cable T4, we see that wire connects to L1 E11 which is -Sense Bit 14 coming from the memory compartment (or my 1130 MRAM board). All the sense bit lines from cable T4 are connected through the backplane to the pins of the card slot where they are implemented, including bit 14, so this wiring is redundant.

IS THIS A CLUE?

OR . . . There was a failure in this backplane causing some traces to become broken, which required the wire wrap to restore signal continuity. If this wirewrap connection became corroded at either end, it might lead to sporadic errors from vibration of the machine. I can check this theory by adding another wire between the pins. If the problem disappears with bit 14, I will have found wisps of gunsmoke, although not precisely the smoking gun itself. 

Adding functionality to 1627 Plotter controller card project

REQUEST TO RECEIVE PLOTTER COMMANDS OVER USB SERIAL LINK

A great suggestion came from a museum that will build one of my 5806223 substitute cards to include 1627 plotter support in their IBM 1130 system. If my card could output serial data through the USB connector of the FPGA daughter board, they could use that to produce an image on a monitor of what the plotter would be drawing, but without having to use plotter paper and pen ink. 

When my card receives an XIO Write command to the plotter from software in the IBM 1130, it will grab the six bits of the request and send them as a stream of six ASCII characters, 1 or 0 depending on the state of each bit, followed by a carrier return and line feed. The serial link will run at 38400 baud which is more than fast enough to handle the rate at which the plotter can accept movement commands (an absolute maximum of just over 263 movements per second). 

ADDED CODE TO PERFORM THIS IN THE DIGILIENT CMOD S7 FPGA

The logic to drive the serial port required a 100 MHz clock, which I generate from the onboard 12.5MHz clock of the FPGA. The logic now has two clock domains, thus I made use of an independent clock FIFO to pass the data from my original logic over to the faster data pump which will format and drive the characters out of the serial port.

As the main logic processes the XIO Write from the 1130, it grabs the six bits and pushes them into the FIFO after which it handles the physical plotter and status back to the 1130. 

My data pump grabs any word pushed into the FIFO. For each of the six bits in turn, it will set up an ASCII 0 or 1 character and trigger the UART logic module. The UART outputs a start bit, the eight bits of the ASCII character and a stop bit all at 38,400 baud. The UART logic signals readiness for the next character, which advances my data pump to step through the six bits from the XIO Write. Once done outputting those six characters, it sends ASCII characters x0D and x0A, the carrier return and new line codes. 

SIMULATION TO VERIFY THAT THE LOGIC CORRECTLY OUTPUTS A SERIAL STREAM

I modified my testbench to capture the UART transmit signal coming out of the UART logic and ran it with both/drum pen movements and pen raise/lower commands. It performed appropriately and confirmed that the output stream will complete before a single pen or drum movement will finish. 

Tuesday, April 14, 2026

Working on the connectors for the substitute 1627 plotter controller card

NEW APPROACH - BORROW CONNECTORS FROM A SACRIFICIAL IBM SLT CARD

I came to the realization that if I could take the specially shaped connectors from an IBM Solid Logic Technology (SLT) card and install them on my board, it would give me a card that will snap into the backplane socket and lock in place. This absolved me from the need to design and build a hold-down method for the card. 

I grabbed a card from my stock, took the plastic connector covers off, and then unsoldered the 24 connectors. I hadn't shaped the copper pads on my printed circuit board to the exact shape of the IBM connectors, but I experimented soldering some onto the card and found that they would work with the existing PCB design.


I used my heat table and hot air rework tool with solder paste to attach the connectors. Many of them slid into decent alignment, but others were skewed or shifted relative to the card edge. The plastic connectors that fit over the card connectors have dividers that fit between each contact, thus alignment is more critical than simply to ensure pin contact without shorting to adjacent connectors. 

GOING TO NEED SOME KIND OF A JIG OR NEW INSTALLATION PROCESS

The next and more serious problem arose when I flipped the card over to install the connectors on that side. The heat that melted the solder paste and allowed the contact to pull into position was conducted to the underside and also remelted the solder under the previously installed contacts.

The contacts on the bottom side would either fall off or shift out of position. Some turned 180 degrees from their intended positioning. While I could finesse the contacts enough to get the plastic covers over them, unless the contacts were all at the proper position at the edge of the card, the locking action of the backplane pins wouldn't be reliably applied to all 48 connectors. That might be solvable with enough fussing, but the desoldering effect on the other side of the card is the show stopper.

I had my hot air tool set to 180 C but the solder paste has a melting point of 138 C thus I should drop the temperature to maybe 145 C. My table was set to 130 C which is too high given the low melting point of the paste, so I should drop that to perhaps 115C. I still believe the heat will conduct through the PCB and release the contacts on the other side from where I am working. 

One idea I had was to use two solder types, with different enough melting temperatures. I could install on side using the higher melting point solder, then lower the heat and use the other solder for the back side. If done properly, I would never soften the solder joints from the side I first installed. I just ordered some solder paste with a temperature of 183 C which should arrive tomorrow. 

That wouldn't perfectly solve the alignment issues, so I also am investigating some kind of alignment jig that could hold all 48 connectors in the proper spacing on the pads of the printed circuit card, so that I could somehow get hot air in to melt the solder paste for all the pads. Once they cooled I could remove the jig and have all the connectors in their intended locations. 

The jig would need to be able to withstand temperatures of about 150 C (around 300 F) since I was using 138C solder paste. It also must not stick to solder. 3D printed nylon parts generally use filament that melts at about this level, making them unsuitable. Quick manufacturing with laser cutting or 3D printing typically involves materials that won't stand up to the heat. 


Monday, April 13, 2026

1130 MRAM board effort continues - not quite there yet

SWAPPED CARDS BUT ISSUE REMAINS AT BIT 14

The issue is somewhere from the pins of sockets L2/L3 in gate B compartment B1 of the 1130 out to my 1130 MRAM core memory replacement board. I continues to be intermittent, but fails on the order of once every few hundred accesses. I also find that bit 10 continues to fail but that might be one time for every few dozen times we stop with a bit 14 error. 

I resoldered all the leads and components on my PCB that are involved in handling bit 14 - no change in the results. I examined the backplane where the card for that bit plugs in (L3) and noticed that a wire wrap connection was made from the T4 cable connector on top down to the pin where the sense pulse for bit 14 is connected to the card. That connection should already exist on the backplane, so the added wire seems redundant unless it is fixing a defect in the board. If there was a defect it might have spread a bit. 



Sunday, April 12, 2026

Continued confusion over analog issue with the 1130 MRAM board BUT progress made

SLOWING THE EDGES OF MY SENSE PULSES

I could apply a low pass filter to remove high frequencies from the signal so that the pulse is rounded, to see if that will correct for whatever the heck is going wrong on the Solid Logic Technology (SLT) circuit board that is implementing the Storage Buffer Register (SBR). That card expects a falling edge from my board as a sense pulse and should turn on the SBR bit when it receives the pulse. However, once every few thousands to millions of times, it doesn't quite turn on. 

Hooking a scope probe to the pin seems to mostly tame the beast. Thus if I could add the same impact to the pins at the backplane, I might be able to achieve consistent reliable operation. A complication is that the signal is directly routed from my board to the pin where it enters the SLT card, so I have no reasonable way to insert a series resistance. This means that a typical RC low pass filter isn't practical. 

I did develop a load that will look similar to the probe - a simplified equivalent circuit ignoring cable inductance, cable capacitance and the complexity of the actual equivalent circuit. I then increased its low pass behavior hoping to slow the edges a bit more. If that does solve the analog issue plaguing the memory substitution project, I will see no parity error stops at all and fully correct readback of memory at all times. 

The load circuit is a resistor and capacitor in series from the pin to ground. I have 18 pins that need the loading applied, if this works, which I will support with a teeny PCB that slides over the pins in place on the SLT backplane. The SBR card is a double width card that implements two bits of the register. 

I put together a couple of the circuits and hooked them to the two bits that seemed to be the most problematic. It had no effect at all. I think this was a false trail. 

SWAPPING CARDS TO SEE IF THE BITS THAT FAIL MOVE

The SBR register is implemented with several SLT cards - IBM type 5804619 - each card implementing a pair of bits. Eight cards are installed in gate B compartment B1, in slots B2/B3, C2/C3, D2/D3, E2/E3, H2/H3, J2/J3, K2/K3 and L2/L3. The most common bit error is bit 10, which resides on the card in J2/J3 but there were also some errors on bit 13 which is K2/K3. I will swap these with the cards in C2/C3 and D2/D3. If the failures move to those bits it will point at the card, but if the failure does not move then the issue is in the cabling, backplane, or my design. 

The problem with bit 10 disappeared, and in fact the only sporadic drop is with bit 14 which is one of the cards that I did NOT move around. Perhaps the rodent urine atmosphere layered a bit of corrosion on some contacts between the cards and the backplane, which I wiped off by the removal and insertion. I will try to swap L2/L3, which implements bits 14 and 15, with the card in E2/E3 in the hope that this resolves any added resistance that was plaguing the circuit operation. 

HAND TOGGLED CODE TO VERIFY THAT DATA IN ALL WORDS MATCH THEIR ADDRESS

My loop wrote the address of each word as its data, then the new loop read and compared the contents of each word with its address as a means of catching any mangling of data or addressing defects. The program ran to successful completion several times. 

USING STORAGE DISPLAY HARDWARE FUNCTION TO FIND BIT DROPS

The last work I did today was to let the machine loop continually reading every word of memory, unless a parity stop is forced if a single bit gets dropped. I know I am not dropping pairs of bits because of the loop that verified memory word contents match the address, but I will get stops where bit 14 is dropped. I can easily tell that is the case because the Storage Address Register (SAR) should always match the SBR due to what I wrote throughout memory. In each stop, bit 14 was missing in the SBR but part of the address in the SAR. 




Thursday, April 9, 2026

Collecting data with logic analyzer on 1130 MRAM parity stops - tantalizing hints

ERROR STOP WE ARE TRYING TO CAPTURE

The IBM 1130 employs odd parity to detect core memory errors, where each 8 bit half of a memory word has an associated parity bit to make the count of bits with a 1 value be odd. If the count is not odd when retrieving a word, the machine stops with a Parity Check error. My replacement for the core memory has a much more reliable memory technology and thus does not bother storing parity bits with each word. It instead generates the correct value for the parity bits as a word of data is read.

I can load and display memory several ways using my 1130 MRAM memory replacement board, with no detected errors. However, if I load the IBM high core memory diagnostic program and run it, the program encounters parity stops at predictable, repeatable points in the code. This happens after the code has successfully run through the same point more than a thousand times. 

I could also repeatedly see the error when I store and then display words at certain addresses. Anything with data having a 1 in bits 8, 12, 13 and 14 would come back with bits 12, 13 and 14 as 0 instead of 1. Because an odd number of one bits had been removed, the parity bit would have had to change to ensure odd parity, but it corresponded to the value when 12, 13 and 14 were correctly read as 1 bits, thus triggering the parity error. 

LOGIC ANALYZER SETUP

I used my DSLogic USB logic analyzer because it is very portable and easy to connect, but it is limited to 16 channels of data capture. That does result in iterative changes to use of the probes as I narrow in on a problem. Of course, my initial 16 channels of data need to provide some clue to where to next look. 

I need a trigger signal, which is the +Parity Stop signal when the error is first recognized. I will capture the two parity bit flipflop values and the signals generated when a halfword plus the parity bit has even parity. The two sense signals from my board whose pulse sets a 1 value into the parity bits, -Sense 16 and -Sense 17 will be recorded. Rounding this out will be the +Storage Read signal to place the activity in context of a memory cycle. 

The other eight channels will be recording sets of data bits from the SBR or address bits from the Storage Address Register (SAR). Since there are 16 data bits and 13 address bits, it will take at least four runs to record all of them in conjunction with the eight channels from the paragraph above. 

OSCILLOSCOPE USED TO LOOK AT SENSE PULSES FOR BITS 12, 13 AND 14

The four channel scope was set up to trigger on the +Parity Stop signal in one channel and display the -Sense Bit 12, -Sense Bit 13 and -Sense Bit 14 signals on the other three channels. I wanted to confirm whether the 1130 MRAM board is emitting pulses to set the bits to a 1 or not. 

Indeed, I could see pulses coming from my board but the SBR bit was not being set in the 1130. I experimented with longer pulses, with no effect. I then tried separating the pulses with 40 ns pulses within each 75 ns state machine step, but the results became worse. 

RECOGNIZING THAT THE SAME OLD UNEXPLAINED ANALOG ISSUE PERSISTS

 I rebuilt my board entirely from the prior design that seemed to have too much ground bounce, thus encountering spurious retriggering that produced sense bit pulses at improper times. I continually strengthened the ground plane, power plan and size of the power connections within my board. I drove the pulses with very fast discrete transistors controlled by the logic chips. I varied timing and spread out the bit setting. Ultimately, none of these changes gave me a memory that was reliably and consistently working. 

There are constraints on how early in a read cycle that I can set bits in the SBR; I believe I must wait at least 450 ns so that I am in clock step T1 of the four clock step read cycle (T0 - T3), but also must complete all the bit settings before reaching clock step T2 because the 1130 may begin gating the results in the SBR to other registers in the system within that step. 

The two parity bits do not need to be emitted within that constraint. They only need to be set by the end of the read cycle since they are interrogated midway through the ensuing write cycle at clock step T6. This still requires the 16 data bits to be pulsed in that interval. 

This gave me a tight window of 450 ns in which to set 16 bits, just over 28 ns if each bit were set separately. The Solid Logic Technology (SLT) family used in the IBM 1130 is 30 ns nominally, making this impossible to achieve with a single bit in a step.  

If I pulse two bits in each FPGA step, then I have just over 56 ns for the pulse, which should be long enough. However, since I don't understand what is happening with the analog behavior that leads to this issue, I am not satisfied that such a change is sufficient. 

MUSINGS

Each pulse sent to the 1130 is in fact a current sink from the IBM 1130 through an open collector transistor on my board. The power rail on my board is not involved in this current flow just in the minor 1.5ma drive current to the transistors as well as minor switching current in the 74LVC08 quad 2 input AND gate that is delivering the 1.5ma to each transistor. 

The ground plane of my board is joined to the ground bus of the 1130 system with stranded 18 gauge wire which should keep my ground plane from straying too much from the 1130's however my hunch is that this is where the problems arise. When I watched pulses that failed to set the SBR bits, the pulses didn't make it all the way to zero volts on the scope. They seemed to bottom out higher, which could be caused by a voltage differential between the ground planes. 

With an inductance of 800 nanoHenry and an effective resistance at 2.2 Mhz of approximately 60 milliOhms, the resulting impedance is around 20 ohms, giving me a voltage drop of almost one-half Volt on the ground conductor for those high frequency signals if they were a continuous train. 

This is quick and dirty, but it is consistent with the scope observed pulse bottom rising above 0V. The germanium diodes in SLT circuitry have a voltage drop around 0.3V, thus I could easily drive up the pulse bottom so high that it fails to switch the transistor in the register. Depending upon what other pulses were produced close in time to the affected one and what ringing might occur in the ground wire, I could see that it would be possible to get instances where it fails to set the bit. 

I still don't see how specific data patterns cause the failures. These are spread across three SLT cards in the B gate compartment B1 at H2/H3, K2/K3 and L2/L3, across two of the cables between my board and the 1130 and across multiple parts on my board. 

DOING MORE INVESTIGATION

After tightening up the FGPA code even further, I found that the 1130 would run for 5-15 seconds before encountering a parity stop. I noticed that bits 10 and 13 were the most likely to not register in the SBR when they should be 1. 

I then hooked the scope up to the -Sense Bit 10 and -Sense Bit 13 pins on the 1130 to watch the signals when a failure tripped a parity stop. Interestingly putting the scope probe on one of the pins dramatically reduced the rate of that bit failing to set. Putting probes on both led to the machine running 25 to 30 seconds, looping through memory successfully, prior to hitting a parity stop. The machine executes almost 277, 778 reads and writes per second, thus the failure rate was around once per 7 million accesses. However, only words with a susceptible bit set to 1 would cause a parity error, thus the actual error rate is closer to 1 in 3.5 million accesses.

Close, so close, but far from acceptable when the computer may run for many hours to days. However, the fact that putting leads on the backplane pins lowers the error rate is a tantalizing clue. The scope doesn't show ringing on the signal when observed at the pin, but that may be due to the impedance of the scope probe - its capacitance and resistance. The input resistance should be around 10 megohms and the capacitance perhaps 10 picofarad. For 100 MHz signals, the impedance is closer to 100 ohms and at 1MHz the impedance is still around 10K ohms. 

The effect of the frequency dependent impedance is that the probe absorbs the higher frequencies more than lower, rounding the pulses. It acts to slow the rise and fall times of the pulses, which appears to improve the reliability of the memory. Thus I may need to develop a filter to produce similar but larger rounding of the pulses. 

Tuesday, April 7, 2026

Finishing the build of the substitute controller card to hook a 1627 plotter to an IBM 1130

BATTLING TO INSTALL THE GOLD CONTACTS THAT WILL FORM THE SLT SOCKETS

This printed circuit card fits into the IBM 1130 backplane in card compartment A-C1, where IBM would have plugged in a double width Solid Logic Technology (SLT) card 5806223 to provide the controller logic to interface the plotter to the IBM system. The backplane has two slots vertically that accept the card, each having twin rows of 12 gold pins that fit into the sockets on the SLT card. 

My card has springy contacts that will make good contact with the gold pins on the SLT backplane. I used gold plated RF shield contacts to build the card, each of which being soldered onto a pad on the card edge. These are very challenging to install, since they are small and hard to hold while soldering them down. I used solder paste, my heat table and hot air rework gun to solder them, having placed them onto the solder paste by hand. 

These move around a bit, not anchoring perfectly onto my PCB pads. Eventually I got once side set up with contacts, although not as neat and orderly as I would like. 

A few of the pads have no connections to circuitry on the card, so I left the contacts off in those spots. Once I checked for shorts and dealt with any excessively objectionable positioning, I moved on to the other side of the PCB since each SLT socket is two sides of 12 pins each. 

My first try ended in the card sliding off the heated table and scattering contacts whose solder was still molten. After a suitable break, I went back and completed the construction of the other side. 


I had 3D printed covers that fit over the contacts and form the shape of an SLT socket on a card. These slide over guide plates as the card is inserted and position the card socket into the backplane over the pins that form the complementary sockets. 

IBM cards have a complex shape to the gold spring connectors that line up with a curved shaped barb on the end of the gold pins from the backplane, forming a mechanical lock to hold the card in place unless it is tugged out. I can't manufacture parts to do the job, so I need a different means to hold the SLT card down in the backplane when it is inserted. The spring contacts on the card will cause it to push back out of the backplane socket otherwise. 

The solution to holding my card down centers on the guide plates that are on the SLT backplane. The card sockets have a notch on them that slides over one side of a guide plate, with the next card's socket fitting on the other side of the plate. 

A guide plate is circled

Pointing at one notch

It is hard to see the relationship based on the way that IBM drew the card socket and the existing pictures from IBM manuals. 

The drawing above shows how the two adjacent cards slide over the guide plate, as seen from the top looking down into the backplane and seeing the edges of the cards. My card is a double width one, thus it would have a guide plate in between the two sockets on the card, much like above, as well as notches on the outsides of the two sockets where other guide plates would fit. 

Adding friction or clamping on the guide plate from my card would seem the easiest solution. I have to make detailed measurements of the guide places and SLT card sockets in order to pick the point where the card should be locked in place, then work out the mechanism to add to my card that will hold it there, ideally by friction rather than a complex clamp. 

Chasing down 1130 MRAM memory issues

PARITY ERROR INVESTIGATION HINTS AT 'REGRESSION' CAUSE AS WELL

I whipped up a short program to enter into the 1130 that will fill memory from location 0010 to the end of storage with values that match the address of each word. Then I can see if there is any sort of addressing defect because the value displayed at a location should be identical to its address. 

Using the Storage Display switch I had the machine loop reading memory. I did spot one design weakness that I quickly corrected but continue to see parity stops at very repeatable locations. First, I will discuss the weakness and how I corrected it.

RACE HAZARD IN PARITY GENERATION LOGIC WHEN SETTING PARITY BITS

A chain of exclusive OR gates produce the proper parity bit value so that each halfword has an odd number of 1 bits. The logic to turn on the parity bits in the 1130 uses sense pulses, just like the pulses that turn on the 1 bits in the Storage Buffer Register (SBR) for any bit of the word that is a 1. I was updating SBR bit 15 at the same time as I was setting the P1 and P2 parity bits, which lead to some wobbling of signals in the 1130 logic before it steadied out. 

Because the 1130 exclusive OR chain was changing because of bit 15 being set at the same time as I was latching in P1 and P2, the logic in the 1130 was susceptible to sometimes considering parity for a halfword to be even (an error) although when the halfword plus its parity bit is considered, the result would be odd. I simply separated the setting of SBR bit 15 from the subsequent setting of P1 and P2 to eliminate this timing sensitivity.

What I noticed was that the parity stops always had a word where bits 12, 13 and 14 should have been one bits, but were read as zero. Look at the recorded stops below. The second row of lights is the Storage Address Buffer (SAR) which is the address from which we read the word, and the third row is the SBR showing the memory contents. 






I realized that the supposed memory regression I reported in the last blog post was just another case of the missing bits 12, 13 and 14. That is, it would appear that the loop reverted back to a value that had its last four bits of 0001 when it should have been 1111 when the logic was incrementing the address in the diagnostic program. 

LOOKING FOR SOMETHING COMMON THAT MIGHT CAUSE THIS SYMPTOM

This is always a word fetched from an address where the SAR has bits 8, 12, 13 and 14 set to a 1 bit value. Other bits may be set to 1 as well, but these are common to every captured parity stop. The word being read into the SBR drops only bits 12, 13 and 14. Because an odd number of bits are missing compared to what was coming out of the MRAM chip, the parity bit is incorrect which the 1130 detects and flags as a parity error. 

Bits 12, 13 and 14 must be coming out of memory correctly and flowing through my exclusive OR chain to produce the proper P2 parity bit, which is why P2 is correct for the case where those bits are set to 1. However, I can tell they are not getting into the SBR since the bits are still 0 after the read cycle ends. 

My FPGA logic in the 1130 MRAM board sets bits 12, 13 and 14 in the same state machine step, although it emits separate signals on discrete traces thus this can't be a solder issue. The step that handles these bits is no different than the other steps that handle bits 0-2, 3-5, 6-8, 9-11, 15, or the two parity bits. Nothing should cause the FPGA to sporadically malfunction only on this step and only for a location and data pattern that as bits 8, 12, 13 and 14 set to 1. 

A single logic gate passes pulses from bits 12, 13, 14 and 15 to the 1130 when the discrete signals for each bit are activated by my FPGA. A bad chip should fail to drive all four, not just bits 12, 13 and 14. Further, this only fails when bit 8 is also on (or addressing memory where the SAR has bit 8, 12, 13 and 14 turned on). The chip in question has no connection to bit 8, which is handled by another chip. 

In the 1130, bits 8, 12, 13 and 14 of the SAR and SBR are implemented across multiple Solid Logic Technology cards thus unlikely to have an issue common to the SAR or SBR that might produce these results. 

Yellow circles around parts generating bits 12, 13 and 14

The parts on the PCB don't have common elements that could explain how they would fail, as you can see in the graphic above. More significantly, the logic supporting bit 8 is on the left side of the PCB away from all of these parts. Similarly as seen in the graphic below, the SAR bits for 8, 12, 13 and 14 are separated around the memory chip.

I just don't see anything on the board that would account for issues arising only when bits 8, 12, 13 and 14 are turned on in SAR and the memory word but bits 12, 13 and 14 are not set in the SBR. It is time to go back to the oscilloscope, watching the pulses for SBR bits 12, 13 and 14 while monitoring and triggering on parity stop. Perhaps I can see something suspicious on the signal lines that could explain the results. 

Sunday, April 5, 2026

Odd error detected with memory, possible issue on the 1130 MRAM board

BIZARRE ISSUE WITH MEMORY REVERTING TO OLD VALUE

I was running the memory diagnostic with parity stops disabled - the parity issue is a separate problem I am troubleshooting - and the loop advancing through memory was never ending. When I looked closely I found that the code was adding 1 to a stored address in a memory word but would seem to skip back to a prior value. 

It began at some point with an address around 0481 and would step up to 048F before returning to 0481. If I stored a higher address in the memory word, for instance 0491, it would advance to 049F and then return to 0491. I hand stepped the code and it appeared to be correctly advancing the address to 04A0 and stored it, but then jumped back to 0491. 

I then manually displayed and loaded the word where the address was stored - this in memory location 02E7 - and saw very puzzling behavior. I would display the value in 02E7 as 0491, then update it to 04A0. The first time I displayed the content of 02E7, I retrieved 04A0 but then when I displayed the same location again, I saw 0491 returned!

Memory is not a push down stack. Writing a value in a location should totally replace the old value. If it reads as the new value once, it should always read back as the new value unless I rewrite it explicitly back to the old. It should have no way to 'remember' the prior value.

WHAT MIGHT CAUSE THIS?

I did some thinking about mechanisms that might lead to this behavior. I stopped when I had a path that could deliver the old value for a read request, not diving any deeper to find a means that it could accomplish the feat, simply looking at a pathway to get that old value back.

A memory cycle in the IBM 1130 is based on the way that core memory works. Reading the content of a word involves destructively setting the word to all zeroes, detecting which bits were previously set to one. Those bits that had stored a one before the destructive read will cause the core memory system to deliver a pulse into the 1130 where the Storage Buffer Register (SBR) has that bit flipped to be one. 

The second half of the memory cycle will write whatever is in the SBR into the cores. It actually tries to flip every bit of the word to one, but inhibits the flip if the corresponding bit in the SBR is a zero. Thus core memory erases the contents, transferring its value into the SBR and then rewrites the word from the SBR. If the 1130 wants to put a new value in a memory location, it first reads the current value into the SBR and then updates the SBR before writing it to the machine. Every memory cycle has a read followed by a write. 

Thus, the first possible pathway is if somehow the SBR is updated after a successful read, putting a different value and then writing that different value back. This would let my first read of 02E7 successfully pull the value 04A0 into the SBR but somehow during the write it is changed to 0491 and written that way. The next time it is read back, 02E7 returns 0491 and not the value we thought we wrote into it. I don't yet have a way that the 0491 value would be retained in the 1130 and forced into the SBR for the write cycle, but this is a way that reversion could occur. 

Another possibility is if the address lines running into the MRAM chip on my board were to change during the cycle, reads might actually be fetching values in two different words. Thus, if the address 02E7 is sometimes seen as 06E7, two different values could be retained and returned. I don't understand how the first read of 02E7, after we updated it to 04A0, would address one word and subsequent reads would address the the other word location, but this is a way I could pull a previous value from a location.

One final possibility is that the chip itself is defective. It might allow the value in 02E7 to slowly revert to the old value even though it held an updated value for a short time. It might misaddress locations in the chip much like my speculation in the prior paragraph so that two different locations are being retrieved at different times. 

I could watch for the first speculation by using the logic analyzer to record the SBR bits, let the machine get into the loop where it reverts, then examine the trace to see if the write cycle is changing the value of the SBR. 

I could watch for the second speculation but only if the address bits change in the 1130 in the Storage Address Register (SAR). That would happen if I trace the 13 address bits of the SAR and record while the machine is in the reversion behavior. However, if the address bits are flakey on my 1130 MRAM board and not from the SAR, then I wouldn't catch this issue with the logic analyzer. 

I will reflow the address bit soldering points on my board to eliminate the chance that the cause might stem from a poor connection. However, to test for errors inside the MRAM chip itself, I might need to manually do sequences of load and display operations on the 1130 while recording the SBR bits. 

Thursday, April 2, 2026

Trying to track down the parity stop failure using my 1130 MRAM board while running IBM's core memory diagnostics

RECAP OF THE FAILURE TO BE STUDIED

When running the IBM 3B1 diagnostic - core memory testing with the code residing in low addresses - the machine will stop with a parity error at the same location retrieving from the same address. The program had executed the loop more than a thousand times before the error occurs. The machine is executing a store instruction in indirect mode, where it puts the data in the location stored in the memory word, rather than into the memory word itself. 

The machine has just fetched the address from the memory word but hadn't begun to store the contents of the accumulator register into that address. The data that was fetched into the Storage Buffer Register (SBR) and the two parity bits don't agree under the odd parity rules of the system. Since my card generates the two parity bits on the fly from the retrieved word, this should not happen. 

TRACING STATE LEADING TO THE FAILURE

I set up the scope to trigger on the setting of a parity stop, while monitoring various other signals such as + Storage Write and the actual output of the parity testing logic in the 1130. The goal is to see what seems incorrect or hints at other places to look, with the ultimate aim of seeing the definitive root cause of the failure. 

The eight data bits of each half of the SBR are cascaded through exclusive-OR (XOR) gates so that we know if there is an even number of bits that are set to 1. The parity bit associated with those 8 data bits is used to ensure that the total 1 bits in the 8 data and 1 parity bits come to an odd total. When the machine fails, it is because one of the halfwords and its parity bit have an even count of 1 bits. 

I consistently saw the diagnostic produce an error where the right halfword (bits 8 to 15) had the mismatch with its parity bit P2. When I put the scope leads on P2 and the output of the XOR cascade for that halfword, the mismatch is now with the first halfword and its parity bit P1. Moving the scope leads to that side and rerunning, I found that the error flipped back to the second halfword again.

I doubt this is a quantum phenomenon where an observed condition works differently than when it is not watched. However, something must be caused by high impedance scope leads attached to one of the nets. I wonder what will happen if both sides are observed at the same time. Will the machine run without parity stops? Seriously, I do need to observe more points simultaneously, which means I have to move over to a logic analyzer. 

More work building 1627 plotter controller card for IBM 1130

FINAL COMPONENTS INSTALLED

I soldered down the linear voltage regulator and the remaining logic chip - a 74LS05 open collector hex inverter. I then placed all the resistors and capacitors onto the board. 

The pads across the top are where the spring contacts will be soldered. Those contacts will slide over the pins on the 1130's backplane board where the 5806223 card from IBM would be installed. Of the 48 positions total across the two sockets, 21 are not used. Three pins are used to deliver power and ground the the card, with the remainder carrying signals between the card, the IBM 1130 system and the plotter (IBM 1627, Calcomp 565 or Calcomp 563). 

Wednesday, April 1, 2026

Constructing the 1627 plotter controller card for the IBM 1130

REDESIGN USING FPGA DAUGHTERBOARD FOR LOGIC

The original design used surface mount chips including multiple timers and combinatorial logic, matching as closely as feasible the circuit design of the IBM 5806223 card which implemented the controller function for the IBM 1627 plotter when connected to an IBM 1130 mainframe. 

INSERTING COMPONENTS ON PRINTED CIRCUIT BOARD

PCBWAY sponsored the printed circuit card for this redesign, which I received recently and wrote about. I soldered on the daughtercard (Digilent CMOD S7 FPGA board) and one of the integrated circuit chips. As the remaining parts arrive and I have time, I will solder up the rest of the components on the PCB. 

The most time consuming part of construction will be soldering down the contacts that will form the Solid Logic Technology (SLT technology of IBM mainframes from early 1960s) connectors. This card plugs into two SLT slots inside the IBM 1130 system. 3D printed covers finish off the connectors on the card, covering the contacts and guiding the mating of the card into the SLT socket. 

Above you can see the current state of the new card on the left and the earlier version on the right with its connectors at the top. Pads on the new card are visible, onto which the metal contacts are soldered to create the connectors. 

Tuesday, March 31, 2026

Honing the FPGA logic for the 1130 MRAM board and testing results

FINE TUNING THE STATE MACHINE

There are points where I examine the external signals coming from the IBM 1130 in order to start the read or write portion of a memory cycle, as well as whether to bail out if I find that the +Storage Use signal is not asserted. 

These signals are passed through four clocked flipflops in order to handle the possibility of metastable states since the 1130 could change the signal right at the same time as the clock edge of the FPGA since they are not in a synchronized clock domain together. I had been simply examining the output of the last flipflop for the +Storage Read, +Storage Write and +Storage Use signals but if the signals are glitchy, looking at a single 5 nanosecond point in time might give me a false positive. 

To protect against this, I added four more clocked flipflops to each signal chain and then verify that the last four are all set to 1 in order to treat the signal as an actual positive. If there is a temporary glitch to 0, we just wait another few cycles until all four flipflops are filled with 1 in order to proceed. Similarly, the +Storage Use chain must have the last four flipflops at 0 in order to act as if storage use is not requested for this memory cycle. 

The state machine, once started in a read or write portion of a cycle, will finish its activity and then wait until the 1.8 microsecond cycle portion is almost complete before it begins to look for the 1130 signal to proceed into the other half of the memory cycle. If I find that storage use is not requested, even if the state machine began the read cycle, it will wait long enough to have passed almost fully through the entire 3.6 microsecond memory cycle before it starts looking for +Storage Read again. 

When I look at the logic diagrams for the IA cycle, it shows that the Storage Buffer Register (SBR) is cleared for the entire duration of clock step T0 - from 0 to about 450 ns - and then released so that the sense pulses from my board can set the relevant bits. My previous logic was emitting the set pulses prior to 450 ns so that had to be changed.

I also see that the logic will take the results from the SBR and move them to the ACC register during clock step T2 which occurs from about 900 to about 1350 nanoseconds. Thus my results from the sense pulses must be transferred before 1350 ns. The spec for the sense pulses from the IBM core memory is for them to occur as early as 700 ns and as late as 950 ns which puts my real upper bound at 950 ns. 

I adjusted the timing of the FPGA state machine to fit with those constraints. 

RESULT OF TESTING SHOWED THE SAME PARITY STOP ERRORS

The core memory diagnostic fails at the exact same spot every time. It is in a routine that fills memory with a given pattern and at an address that begins with 0x000011111xxxxxxx and not when it first executes the code. It makes it more than 1500 loops before it encounters the error. 

It fails consistently at certain address values while in full speed RUN mode. However, if I step the 1130 with single instructions it does NOT fail. It is a timing issue that is marginal enough that it is dependent on specific values to run into trouble. In most cases the data shows up exactly as expected in the SBR, even when I view the display panel 

The code is storing the pattern into memory words using a STO I ADDRS instruction, a store of the ACC register into the address that is contained in the memory location ADDRS. It first fetches the value in ADDRS, then performs another memory cycle for indirect addressing (IA cycle) which will set up the Storage Address Register with the new location into which the value in the ACC register will be placed during the next memory cycle E1 (execute cycle 1). 

It does allow me to speculate about how the parity stop is being triggered, however I need to set up the scope to try to trap the situation and trace it back to be certain. 

Parity stop occurs when the exclusive OR of the eight data bits in a halfword plus the parity bit associated with that halfword result in an even count of 1 bits, at the start of the T6 or X6 clock step. T6 is in the middle of the write portion of the memory cycle, whereas I believe the fault that causes the stop is happening earlier. 

Since the parity bits are generated by the contents of the MRAM memory but the bits in the SBR are injected by the sense pulses from my board, if the high order bits are somehow not getting set into the SBR due to the timing issue, but the parity is generated based on the retrieved bits, then we could trigger the parity stop. 

What I don't understand is why the high bits of the SBR are almost always stored correctly, and even in the case that failed it has executed the IA step for the instruction more than 1500 times successfully before. Why is the timing not only marginal but failing specifically at this one time predictably. 

Sunday, March 29, 2026

Finding remaining issues on my MRAM board

ENHANCED MY FPGA CODE AND RETESTED

I added some logic that aborts read and write operations if it discovers that the +Storage Use signal is not active. This protects against possible race hazards that might start my state machine although the 1130 does not intend to access core memory. Just before it sets bits in the Storage Buffer Register (SBR) for a read and before it writes new data into the MRAM chip, I check +Storage Use and skip over those actions. It does this by waiting long enough for the entire 3.6 microsecond storage cycle to be complete. 

I also added a step in the state machine that turns off the tristate buffer. The changes were simulated and then a configuration file was generated to load into the FPGA which I did when I returned to the workshop. 

Most importantly, since I saw some signs of retriggering two read cycles within one 1130 read cycle, I added delay logic to the state machine so that it let enough time expire after finishing the read or write that it was almost at the time when the complementary cycle (write after read or read after write) would start, thus not allowing the state machine to be tricked into a double cycle. 

Storage Load and Storage Display functions were tested again and behave correctly. The 1130 mode switch was set to Load and Display to manually access storage, which also behaved properly as it did before. 

I then loaded the core memory diagnostic program using my Console Loader enhancement to the 1130 and ran it. Previously it failed with a Parity Check consistently at one point in the code. It still fails the same way. This is only happening with certain instruction sequences, otherwise the machine runs reasonably large blocks of code correctly. 


If it were an issue where the data contents, the Storage Buffer Register bits, were changing midcycle then whatever was written to MRAM would always have correct parity generated on its later retrieval in a read cycle. The SBR should not be changed during the portion of the read cycle where I am emitting the pulses to update the SBR. If a read were to complete but is repeated due to changing SAR bits in between when the data bits begin storing in 85 ns clusters and when the computed parity is stored in the last 85ns cluster, it could cause the symptoms.




Furthermore, looking at the three parity stop cases above, I see that in every case, it is the right halfword that does not agree with its parity bit P2 and it is likely that bit 8 is being spuriously stored in those cases. Thus I may have an error in my printed circuit board where there is a short between pins 8 and 9 on the FPGA (CMOD S7) board connector or between pins C1A11 and C1B11 on the T1 connector socket. I will check this in addition to looking more closely at the code being executed when the parity failures were caught. 

It is possible that there is an issue with some timing related to when the 1130 changes the Storage Address Register and when I begin a read or write, such that the contents are a blend of the old and new address. The fact that bit 8 is always on in this parity stops is suggestive that this is closer to the root cause than mistiming and SAR changes, but I will have to investigate all of it. 



Tuesday, March 24, 2026

1627 Plotter controller card redesign - printed circuit board arrives from PCBWAY.COM

PCBWAY.COM SPONSORED THE NEW PCB, BOARD ARRIVED TODAY

I received 5 printed circuit boards for my new design of a controller card to insert into an IBM 1130 system in order to connect an IBM 1627 Plotter. PCBWAY.COM had contacted me on this blog and offered to sponsor some printed circuit fabrication for upcoming projects. I thought this project would be a good opportunity to try this out for both them and me. 

IBM makes a card that is plugged into a logic compartment in a specific slot to add support for the 1627 to the configuration of the system. It is built with their Solid Logic Technology (SLT) components as a double width card. SLT cards plug into a socket on a backplane using a connector that has two rows of 12 pins. The double width SLT card is 3 3/8" wide. 


SLT backplanes are in a compartment, with space for up to 65 single width SLT cards plus some cables that use the same 2 x 12 connectors. Slots are labeled with columns A through N and rows numbered 2 to 7The IBM 1130 has two swing out gates each of which holds three compartments. The 1627 controller card from IBM (part number 5806223) fits into gate A, compartment C1, in slots M4 and M5. 

The card implements logic to handle the input-output instructions for the device at Area Code 5, which is what IBM assigned to the 1627 Plotter. Asking the plotter to move the pen is done by issuing the XIO Write instruction, with bits in the transferred word assigned to lift the pen off the paper, lower the pen onto the paper, move the pen left or right or move the drum with the paper down or up. 

The state of the Plotter is interrogated by issuing an XIO Sense Device instruction which returns a word with bits assigned for various conditions. The card will raise an interrupt request when the pen movement is complete, informing the software so that it can issue additional movement requests. 

The card implements the XIO Write and XIO Sense Device functions for Area Code 5, requests the interrupt on level 3 when the operation is complete, and sends signals to the 1627 to command the various pen movements. 

My redesigned card uses an FPGA board (Digilent CMOD S7) to implement the logic functions, with the card providing the interface chips for signals to and from the IBM 1130 and signals to the 1627 Plotter. It also drops the 12V power rail from the 1130 down to the 5V level needed for my chips and the FPGA board. 

The most complicated part of the card is the contacts that form the connectors which plug into the SLT backplane. The backplane has 24 pins for each of the two sockets, while the card slides over the pins and locks into position. The locking is mechanically complicated and very difficult to reproduce, with the pins having a hook at the end that locks over a bent contact shaped to form a notch which holds the hook. 

My previous version of the card had contacts that mate with the SLT backplane pins but don't latch. The card therefore backs out of the backplane sockets. I need to work out a method to hold the card down into the sockets until I want to pull it out. 

SWITCHING TO USE PCBWAY WAS PAIN-FREE

I have been using other fabrication houses in the past but found the change extremely easy to make. I could use the same settings and design approaches with KiCAD that I used with other fab houses. The requirements for what has to be sent to PCBWAY.COM were very flexible and accommodated the settings I already used. 

The website is easy to use (at least for anyone used to working with printed circuit fab houses), well documented, and has lots of supporting information if you have questions. I defined the size of my four layer printed circuit boards, accepted all of the default choices for copper weights, layer spacing and so forth, making only one change so that the order number is NOT printed on my boards. My design files were uploaded and the site gave me prices and other options. 

It was very intuitive to request a standard manufacturing turnaround (4 to 5 days for my design) and select which shipping method I wanted. I picked DHL but there were other options including Fedex and UPS. 

QUICK MANUFACTURING AND SHIPPING

They offer the ability to select faster manufacturing turnaround and even quicker delivery than the 3-7 days using DHL, but I found the standard choice and DHL to be good enough. I placed the order and once I coordinated the sponsorship with PCBWAY.COM they began manufacturing in the evening of Sunday March 15th. 

The production was completed and the box went out with DHL by March 19th. The estimated time for standard production was 4 to 5 days, which this met with a bit of room to spare. 

They don't control the shippers nor customs processing, but the box arrived on Tuesday March 24th. Quite satisfactory for an international shipment.  

OPENING THE BOX

This came in a plain white box, shrink-wrapped and there was no rattling when the box was shaken. I opened the box to find some white foam padding inside.


I took out the padding and came to the receipt plus the circuit boards vacuum packed in a bubble wrap material. A bag of desiccant was sealed inside to absorb any moisture that might seep in. This is how printed circuit boards should be shipped.


There were actually six boards inside. My guess is that they had a panel with some errors in someone else's card and remade it, but the area with my board was good. The other person received five boards from six panels, so I got a bonus board. 

I cut open the bubble wrap and inspected my boards. They look very well made, certainly matching my design and right up to the standard I expect from an excellent fab house. 


As you can see, it is a relatively simple board, although I do use four layers to give me a solid ground plane. I feel confident that PCBWAY.com would handle far more complex boards and deliver the same quality. Thank you, PCBWAY.COM, for the sponsorship of this board for my project. 

WILL ASSEMBLE PARTS ON THE BOARD SOMETIME LATER

This project is a lower priority activity which I will work on at times when I am in waiting mode on higher priority efforts such as having ordered additional parts. However, such pauses are frequent so I do expect to put the board together in a month or two. I did order the FPGA board and other parts already so that I could even install the components on it in short order. It will be the soldering of the SLT socket on the top that will take quite a bit more time and adjustment, so that may not be worked on until the priority bumps up. 

Sunday, March 22, 2026

The advantage of leveraging FPGA for 1130 related designs - 1627 Plotter behavior discovery

ATTACHING 1627 PLOTTER TO IBM 1130

The IBM 1627 Plotter is a private labeled and slightly modified version of the Calcomp 565 or Calcomp 563 depending on the model of the 1627. It moves continuous paper forward and backwards over a drum, with a pen that moves left and right along the drum. The drum and the pen move in increments of 1/100 inch to draw graphs and other images. The pen can be raised to move without drawing and then lowered to put ink on the paper. 

IBM supports the plotter by installing a double width Solid Logic Technology (SLT) card into a specific pair of sockets in one compartment of the 1130. This 5806223 card implements the device controller logic to permit software running on the 1130 to draw using the plotter. A cable from the 1627 has two Standard Modular System (SMS) paddle cards that plug into the 1130, one providing 115VAC power and the other connecting signals between the 1627 and 1130. 

The 1627 is a very simple device. Pulses into the machine command movements, which the plotter accomplishes, but does not provide any feedback to the 1130 about movements or status. The only signal from the 1627 connects to an internal power supply that produces -24V, thus the 1130 can see if the wire is at -24V to determine if the 1627 is connected and powered on. 

The controller card in the 1130 responds to the 1130 instruction XIO (execute input output). If an XIO with the device address of the plotter - area code 5 - is issued, the controller card looks at the contents of a memory location pointed to by the XIO instruction.

The first six bits of the word at the memory location are used to request one or more movements. Movements can be combined in one XIO instruction of type Write. Going from left to right, they request:

  1. Drop the pen down onto the paper
  2. Roll the drum upwards (backwards on paper)
  3. Roll the drum downward
  4. Move the carriage with the pen to the right
  5. Move the carriage with the pen to the left
  6. Raise the pen up from the paper
The controller generates the proper duration pulse to the 1627 to cause the movement. It also maintains status of what it believes is happening in the 1627 since there is no feedback from the plotter. When the controller believes the movement has completed it raises a request to the 1130 to interrupt the currently executing instructions and instead execute interrupt handler software. 

An XIO instruction of type Sense Device is used to see the status as the controller card sees it. The card sets bits that the XIO Sense Device will place in the 1130 Accumulator (ACC) register for interrogation by software. When the controller is requesting an interrupt, bit 0 is set to 1; this is interpreted as operation complete. If the 1627 is not powered on or not attach, the lack of the -24V will cause the card to report the plotter as not ready by setting bit 15 to a 1. Finally, if an XIO Sense Device is issued after an XIO Write but before the interrupt is requested by the card, then bit 14 is set to 1 to indicate that the plotter is busy accomplishing some movement. 

The more common model of the 1627, model 1, takes about 3.9 milliseconds to complete a movement of the drum or carriage. Raising or lowering the pen takes about 100 milliseconds to complete. Thus the time from an XIO Write to the interrupt request is 3.9 or 100 ms. Bit 14 reports the plotter is busy during those intervals.

DISCOVERED SUBTLETY IN BEHAVIOR

In reading the 1130 Functional Characteristics manual which informs programmers how instructions and peripheral devices will behave, I discovered something I had missed in my earlier implementation. If the 1627 is not powered on or not connected to the 1130, when an XIO Write is executed for the plotter, the machine will immediately generate an interrupt request. Thus an XIO Sense Device immediately after the write will return bits 0 and 15 set to 1 without the time delays that occur if the request went to an operational plotter. 

VALUE OF A SOFT IMPLEMENTATION USING AN FPGA ON THE CARD

My first implementation of a substitute for the 5806223 IBM card used multiple integrated circuits including timers and other combinatorial logic. I switched to a card that uses a Digilent CMOD S7 FPGA as a daughterboard and just a couple of glue logic chips. 

This makes it very simple to change the functionality to include the behavior when the 1627 is not ready so that it does trigger the interrupt request immediately after an XIO Write. Had I not used the FPGA which can be reloaded, as in the earlier implementation, I would have had to redesign and probably manufacture a new printed circuit board. 

Friday, March 20, 2026

Hoping to finish the testing of the 1130 MRAM core memory replacement board

RETESTING STORAGE LOAD AND STORAGE DISPLAY WITH UPDATED FPGA LOGIC

After the changes I made to delay the write into the MRAM chip in order to allow the Storage Buffer Register (SBR) to complete its setting of the updated value, I loaded that into the FPGA board. I then worked through testing to see if the board is performing as intended. 

I used the Storage Load and the Storage Display switches on the machine which will loop repeatedly through memory storing the pattern set in the Console Entry Switches (CES) or displaying the contents of memory respectively. I checked to see if I could load memory with patterns including the value 0xFFFF which has the maximum of bits with a 1 value, then read them back properly. 

This worked perfectly for a variety of patterns including 0x0000 and 0xFFFF so I moved on to the type of test that filed before

RETESTING LOAD AND DISPLAY MODE USE OF MEMORY

The next set of tests made use of the rotary mode switch of the IBM 1130. Pushing the Prog Start button when in Load mode will store the value in the CES into the next storage location. Pushing the Load IAR button in Load mode will set the next storage location to the address set in the CES. Pushing the Prog Start button will display the contents of the next storage location in the SBR lights on the console. 

This too worked perfectly. I was able to load ranges of data into chosen memory locations, validate the address bits work properly, and do other tests. It appears that the new board is working properly now, so I chose to move on and run some IBM diagnostic programs. 

RUNNING 1130 MEMORY DIAGNOSTICS

IBM provides diagnostics to run that verify different aspects of the IBM 1130, including tests to confirm that core memory is working properly. I used the memory loader function I created and installed on this 1130 machine in order to load the memory diagnostic in core memory, then set the machine to the start address and pushed Prog Start while in the Run mode to let it execute. 

This consistently fails with a Parity Check error at one point in the routine. This could be a consequence of some device controller card jamming bits into the SBR when it should not, or it could be a failure in my board. The error means that the data stored into the SBR by my board does not agree with the parity bits generated by my board. This needs more investigation

Next I attempted to run the CPU Diagnostic which exercises every instruction in all their modes and variations. This consistently stopped with an error while testing the Shift Left Arithmetic (SLA) instruction. However, when I hand stepped through the routine I found that one of the instructions in the routine did not match the diagnostic program listing. I restored that to the correct value but when I reran the diagnostic from the start, it again had the wrong data in that address. This has to be caused by some other portion of the code storing in the wrong place. 

I displayed memory in many spots and found what had been loaded by my Console Loader matched exactly, but I didn't exhaustively check every location after loading. My console load triggers Cycle Steal operations in the 1130. These are typically used by faster peripheral devices to transfer in an entire record of data as it is ready without interrupting the program currently executing. The machine will pause the processor at the end of a memory cycle, holding at clock step T7. It then uses the X clock to take a memory cycle, with the peripheral controller (and my loader) providing both an address and a data word for the memory access. When the X clock gets to step X7 and there are no more cycle steal requests, the processor continues with the next memory cycle by advancing to clock step T0. 

There may be a timing issue with cycle steal and my memory board or an issue with my console loader use of cycle steal. This will take some investigation to get to the root cause so that I can finally get this memory board signed off and the project finished. 

Thursday, March 19, 2026

Testing the 1130 MRAM board on the IBM 1130

STORING ADDRESS AS CONTENTS

I made use of the rotary mode switch Load and Display settings to place bit patterns into chosen memory locations. I set the address in the Console Entry Switches (CES), push the Load IAR button to cause the 1130 to use that as a memory address, then set a bit pattern in memory and push Prog Start while in Load mode to put the bit pattern into the location I previously set. Setting the IAR and pushing Prog Start while in Display mode will show what was in that memory spot.

I decided to put the address in the CES, push Load IAR, then push Prog Start so that the content of the memory location is the same as its address. I did this for all 13 bits of an address - 0x0001, 0x0002, 0x0004, 0x0008 etc -so that I could confirm that addressing is working properly. I also set some complex addresses (more than a single 1 bit on) and stored the value there, just for completeness. Everything worked right with this type of testing. 

THINKING ABOUT HOW THE ERROR MIGHT ARISE

I am having a hard time imagining an error mode in my board that would create the observed symptoms. Every once in a while (in the Storage Display mode where the 1130 system loops rapidly through all memory addresses) a word will be read having the first three bits as zero in site of having stored it as a word with all bits 1. The 1130 recognizes this by stopping with the Parity Error lamp illuminated. 

The 1130 stores two parity bits with each word of 16 bits. One parity bit (P1) covers the first 8 bits of data and the other parity bit (P2) covers the second 8 bits. The machine requires odd parity, meaning that the number of bits that have a 1 value must be an odd number. For example, if a set of 8 bits have the value 00010100 which has an even number of 1 bits, then the associated parity bit is set to 1 so that the collection of nine bits have an odd number of 1 bits. If the set of 8 bits is 00000001 then the parity bit is set to 0 since we already have an odd number. 

Because bits 0, 1 and 2 are retrieved as 0 instead of 1 (0x1FFF instead of 0xFFFF) there is now an odd number of bits that are 1 in the first 8 bits of the word. Parity bit P1 should be off for this value but it is read as having a 1 value. That caused a parity error. 

My board does not actually store the parity bits in memory. Instead, it generates the value of P1 and P2 from the data bits that came out of memory. Thus, if memory had indeed returned 0x1FFF then my board would have made P1 be a 0. Since the 1130 saw P1 as a 1 value, it means I read the correct value 0xFFFF but what made it into the 1130 Storage Buffer Register (SBR) as 0x1FFF and 1 for both bits P1 and P2. 

This means what is failing is the process of setting the SBR to what was retrieved. In the 1130 system, IBM designed it so that the core memory will produce a pulse which pulls a signal line down to 0 if the core memory bit had a 1 value stored, but does nothing if the value in the core memory bit was a 0. Those Sense Bit x lines have a pull up resistor in the 1130 that keeps them up at 3V (logic 1) and the core memory logic acts like an open collector gate, pulling it down to ground level (logic 0) for a short interval to indicate that the memory bit was a 1 value. 

The SBR register is cleared to zero before the read and then any of the Sense Bit x lines that have a negative going pulse will turn on the flipflop for that bit position in the SBR. My board uses transistors to pull the Sense Bit x line down to ground when I am attempting to set a 1 value into the SBR bit position. 

The circuitry inside the SBR that deals with the Sense Bit x signal has charged up a capacitor which is discharged through the negative going pulse from the core memory - the discharge current causes the IBM flipflop to turn on. It takes about 8ma of current flow to cause enough current in the IBM circuitry to turn on the flipflop.

Previous versions of my board would fail if too many bits had a 1 value - too many of the Sense Bit x lines were sinking 8ma at the same time. Some kind of analog issue that I never did track down. My new design tries to handle this by skewing the pulses on the Sense Bit x lines over multiple FPGA clock cycles (a clock cycle is 83.33 nanoseconds). 

The current implementation sets three bits at a time in an FPGA clock cycle, so that the SBR is set across six clock cycles to turn on all 18 possible 1 bits. I do this in sequence, with the first cycle covering bits 0, 1 and 2, the second cycle covering 3, 4 and 5, and the last cycle covering bits 15, P1 and P2. My hardware on the board allows me to cover each of the 18 Sense Bit x signals independently, but I decided to group them into sets of three in order to minimize the time it takes to set all the bits. 

Seeing that the failure was always that bits 0, 1 and 2 did not set, indicates that the problem is likely in my board since that is what happens in one clock cycle of the state machine in the FPGA. All the subsequent cycles work properly, so that all the other bits are turned on in the SBR. 

I can't think of a way that the state machine, which should invariably advance sequentially through the cycles, would skip over one of the states much always fail by skipping the same state. That means I have to assume that it is emitting the control lines for bits 0, 1 and 2 as it should. 

The chip that triggers the Sense Bit x pulse (when the control line is asserted and the memory bit returned is a 1) handles four bits at a time, 0, 1 2 and 3, so that can't be the common cause. 

This feels like a timing issue, where something is marginal in the timing I have set up so that the first cycle of Sense Bit x pulses are failing. This could be timing relative to the 1130 logic circuits or timing relative to the MRAM chip or tristate buffer chips on my board. 

This could be because the SBR is still in the process of being reset because I am too early, or it could be because that the data bus on the MRAM memory chip has not emitted the values yet but it completes driving those bits before the last cycle where the P1 and P2 bits are set. In fact, those two are not stored in the SBR like the 16 data bits, instead it sets two flipflops in the parity checking logic but is completely analogous to the SBR setting process. 

The MRAM data bus is bidirectional. When the notG control line is asserted low, the chip will drive the current word's values on the bus. My tristate buffer chips should be set to high impedance so that they don't interfere with the data driven from the MRAM. When writing into MRAM, the tristate buffer chips
are set to drive values onto the MRAM data bus, while the notG control line is left high or unasserted. 

I can image three cases that might cause problems for a short period - having the tristate buffer driving data at the same time as the notG is asserted, or if the MRAM has not yet fully activated the data bus after notG is asserted low, or if the process of reading the contents of a location in MRAM has not yet completed so that the data bus values are not yet settled.


I switch on the notE control in one state machine cycle and assert notG control line in the next cycle. The issue with the first three bits is occurring in the cycle right after I have asserted notG. Per the timing chart above, the read is complete during the first cycle (35 ns into the 83.33 ns cycle), and the outputs should be on the data bus a mere 15ns into the second 83.33 ns cycle. The data should be present almost 70 nanoseconds before the cycle begins that emits the Sense Bit 0, 1 and 2 pulses. 


The only thing that could result in the data not being present for the cycle that emits the first three sense bits is if the data address from the 1130 system were to be changing somewhere between the cycles that assert notG and emit the first three bits, which would trigger another 35 ns memory access as below:


The 1130 system should hold the address lines from the Storage Address Buffer (SAR) steady before it asserts the +Storage Read signal that starts my FPGA state machine. It takes three cycles for that signal to make it through a serialization chain of flipflops that protect against metastability problems, then another two cycle before we start the one that might be sensitive to changing SAR values. This should not happen unless it is a hardware defect in the 1130. 

The time from disabling the tristate buffer until it reaches high impedance state is less than 15 ns. This control signal was changed a couple of FPGA cycles before the read activity takes place, thus this shouldn't be a timing factor either. 

RECODING FPGA FOR OTHER REASONS SO NEED TO OBSERVE AGAIN

I will be recoding the FPGA to improve some behaviors so I will need to retest to see if the anomalies went away or continued or changed. One thing I changed was to use a clock generator module in order to improve the FPGA cycle time down to 5ns allowing much finer grained timing. 

With this newly coded FPGA logic, I could use the Storage Load and Storage Display CE switches to cause the machine to loop repeatedly through memory storing the pattern on the Console Entry Switches (CES) or displaying the content of memory. It now correctly reads back a word with all bits 1 (0xFFFF) which is a great improvement. In fact, it stored the pattern I set on the CES and read it back in all cases I tried.

I then turned off those CE switches and used the machine's rotary mode switch in the Load and Display modes. Pushing Prog Start while in Load mode will take one memory cycle and write the contents of the CES into the next word location in memory. Pushing Prog Start while in Display mode just reads back the word but doesn't change it. While in Load mode, pushing the Load IAR button will set the next word address to what is in the CES, thus I can arbitrarily pick memory locations for reading and writing.

In this mode, I had mixed results. I could use Load to set values in locations but in Display mode, sometimes the word still had many bits set to 1 that had been the previous contents of the address. In other words, since I had looped setting all addresses to 0xFFFF previously, if I tried to load a different pattern into the location from the CES, I might find my bits merged with some of the prior bits. 

This looks to be a timing issue with the write part of the memory cycle. That is, when the CES value is gated into the Storage Buffer Register (SBR) it should have first been cleared to zeroes before the CES bits are merged in via an OR. It appears that I may be writing too early in the 1.6 uS portion of the memory cycle, before the clear of the SBR has completed. 

To attempt to correct this, I again modified the FPGA code to delay when I started processing the write until about 525 ns into the cycle and perform the write over 65 nanoseconds. This still completes well within the write cycle but doesn't try to store the SBR into my MRAM chip until partway through clock cycle T5. 

If this isn't enough, I could advance even further into the write half of the memory cycle. This is the big advantage of using an FPGA for my board, where I can tweak the timing without having to change any hardware at all nor the printed circuit board itself.