Monday, May 11, 2026

Testing the plotter controller card in the IBM 1130, without a plotter hooked up - part 2

ANSWER TO THE BIT 15 MISBEHAVIOR

With the card out of the machine, I checked the pins on the backplane at slot M4 to check for shorts or unusual connections of the pin B05 that drops to 0V during an XIO Sense Device if pin B08 does not have -24V connected through a 3.9K resistor. 

I checked the card as well, testing the connections between the FPGA board, the inverter gate and the output pin. I also looked for shorts to adjacent pins. I then plugged the card into the 1130 at M4 and M5, then tested whether B05 is now shorted to B04 or B06, the likely issue if a mechanical short exists inside my connector. 

The first issue I observed with the card was that the contact seemed a bit mis-shaped. I swapped a better contact and resumed testing. I discovered that with the -24V applied, bit 15 would turn on, the opposite of what should occur. That was a simple fix to apply to my Verilog code. 

CONTINUING TESTING IN THE 1130

I had to wire up a -24V source to the 3.9K resistor on the cable in order for the controller to see the plotter as ready for commands. If that voltage isn't present, the machine sets bit 15 of the Device Status Word (DSW) to 1 and simply presents an immediate interrupt with operation completion without attempting any control of the plotter. 

I switched on the Interrupt Delay switch under the top cover of the 1130. This blocks the machine from jumping into an interrupt handler even though interrupt requests may be present. This made the testing more straightforward. 

A short program that I hand toggled into memory fired off XIO Write commands to trigger the different movements - Drum Up, Drum Down, Carriage Left, Carriage Right, Pen Raised and Pen Lowered. It could be stepped in single instruction mode to watch the interrupt level 3 request (IL3), then to look at the outputs of XIO Sense Device. 

I hooked up the scope to the output pins on the backplane of the 1130 where the plotter outputs exit the card. What I was looking for was a 12V output steady state while idle and then a 1.9ms or 50ms dip to ground when the pen movement or pen lift/lower commands were issued. The machine should also trigger an interrupt on level 3 and respond appropriately to XIO Sense Device commands. 

I also watched the interrupt level 3 request pin to verify that timing from the issuance of the XIO Write and the assertion of the interrupt request. This too passed correctly. Redoing this with -24V off showed virtually zero delay between the XIO Write and the interrupt request. 

I verified that the interrupt was requested on level 3 after a command was issued. The DSW status bits were correct after the command - Bit 0 on indicating plotter response and bit 15 off showing that -24V is present from the plotter. Turning off -24V and repeating, I saw Bit 0 and Bit 15 both set. These were the expected results. 

Running a program that issues the XIO Write and immediately performed an XIO Sense Device and stops at a Halt instruction allowed me to see if the busy bit 14 would be turned on in the DSW while the controller was active, without having to code an interrupt handler routine to run under level 3. The busy bit was set. 

The hardest test to perform was to verify if bit 14 of the device status would be turned on while the card was actively requesting a movement command and for the succeeding duration where the plotter is expected to be busy completing the task. The easier to detect was the pen raise or pen lower commands, as these should be busy for 100 milliseconds. This too was correct. 

Everything worked perfectly now. I checked the timing of when the interrupt is requested compared to the length of the plotter drive signal and that was spot on as well. I checked all six movement commands just to be certain. The card now operates exactly as the IBM built 5806223 card does, with the same signal timing, levels and behaviors. 

Purple trace is pen movement (1.9ms), yellow is Int L3 Req

USING USB SERIAL LINK TO CAPTURE MOVEMENT COMMANDS FROM CARD

The CMOD S7 daughtercard has a USB connector that can be used for both loading the FPGA configuration information onto the board and for serial communications with an external device such as a PC. It runs at 38,400 baud and emits a short line with six ASCII characters, either 0 or 1, based on the first six bits of the data word written by the XIO Write instruction. Each line is followed by a newline and a carrier return character. 

In order to protect the power supply on my controller card when the USB cable is being used for this purpose, we have to disable having the USB power drive the card; only the 12V from the 1130 into my card will power up the CMOD S7 board. There is a diode (D17) on the CMOD S7 board that connects the +5V from the USB port to the remainder of the board's power circuitry. Opening this connection ensures that the USB cable won't feed any power into the CMOD board or the rest of my controller card.

Diode D17 is circled in red

 From the point that you remove the diode, the way you can flash new code into the FPGA configuration memory device is to apply 12V to pin G02 of the card, ground to D08 and J08, then plug in the USB cable and use Vivado as usual. The card must be out of the IBM 1130, of course. 

INSTALLING A CABLE FROM SLOT N5 TO THE PLOTTER CONNECTOR

I built a cable with SLT connector to fit into slot N5 of the same compartment. That brings out the six signals that drive the plotter - pen left, pen right, drum up, drum down, raise pen and lower pen. This cable also carries the signal ground and brings the -24 supply from the plotter, through a 3.9K resistor, to be sensed by the controller card to determine that the plotter is attached and powered on. 

In order to exhaustively prove out the card, I had to verify that what it emits over the cable to the 1627 Plotter is sufficient to cause it to move the drum up/down, move the pen left/right, and raise or drop the pen onto the surface. The cable needed to be completed that took the signals from Gate A, Compartment C1, Slot N5 and out to the plotter. 

The IBM approach connected a bundle of wires from the SLT connector in Slot N5 and routed them to the Standard Modular System (SMS) connector PF6 inside the 1130. An SMS paddle card inserted into PF6 is wired to the cable that ends in a 19 pin connector (Cannon SK19-23C) which plugs into the plotter. A few wires from the 19 pin connector are hooked to an SMS power paddle card that plugs into SMS connector PP6 inside the 1130, primarily to provide 115VAC to the plotter. 

An alternate approach wires an SLT connector from slot N5 out to the 19 pin connector, with only the SMS power paddle card plugged into the original PP6 slot of the 1130. I chose this first as a faster implementation in order to complete some plotter testing. 

Sunday, May 10, 2026

Testing the plotter controller card in the IBM 1130, without a plotter hooked up - part 1

TESTING IN THE 1130

Since it did everything properly on the bench setup, it was time to verify that it works correctly with the IBM 1130 while inserted into the logic compartment. The newly constructed card was inserted again into slots M4 and M5 in compartment A-C1 of the 1130 system, which is set up for the IBM card that controls the plotter. 

I did basic verification that the slots were indeed wired up to N5 where the connection to the plotter exits the backplane. I then set up some simple tests to see how it behaved without the -24 volts from the plotter applied to pin B08.

It should produce a Device Status Word (DSW) with bit 15 set to 1, indicating that the plotter is either not attached or not powered on. I issued an XIO instruction to an IOCC specifying a Sense Device operation on area code 5 (the 1627). The resulting DSW was all zeroes. This was not what I expected.

I then changed the IOCC to specify a write operation on area code 5 pointing at a word where I had both bits 0 and 5 set to 1. When I executed the XIO, I saw the light for interrupt level 3 come on, which is exactly what I would expect. Having turned on the Interrupt Delay switch under the top cover of the 1130, it didn't jump into the interrupt handler code, so I could more easily debug the card. 

I reset the IOCC to a Sense Device operation and executed it. I saw a DSW with bit 0 turned on (operation complete) which is consistent with the interrupt request. However, I put the oscilloscope on the output pin and never saw it dip down from 12V to 0, as it should have for 50 milliseconds. 

That is consistent with the board behavior if the plotter is not turned on - immediate completion but no command signal sent to the plotter. Everything was correct with the behavior except for the lack of DSW bit 15. 

I then tried to load some memory locations but wasn't able to set bit 15 to a 1 value. Locations that previously had that value would display the 1 in bit 15, but I couldn't load any new values using that bit. The console entry switch (CES) that I used to load memory values shows every switch that is in the 1 position in a register EXCEPT the switch for bit 15 didn't turn on the register bit.

Before I proceed to more elaborate testing, I need to investigate this relatively small issue - bit 15 not appearing in the DSW nor available to load into memory. This could be a short inside my connector on the card, for example, or some other issue in the 1130 that only manifests when the card is plugged in. 

Saturday, May 9, 2026

More bench testing of 1627 controller card

COMPLEX BENCH TESTING SETUP SEEMS TO BE WORKING

The SLT breakout box provides each signal on a banana plug jack. Where it gets cumbersome is when I have to connect to a wire going into a breadboard or some other device. I have some banana cables with alligator clips but mostly they are male to male types. As you can see below, it gets messy interfacing many input and output signals from an SLT card.




I ordered quite a few banana plugs that I can solder to wire segments suitable to inserting in a breadboard or an Arduino type device. That will make this process much easier the next time around. I made up enough to rewire the testbench and clean things up. 

I put the new Arduino Uno into the testing setup and now see the XIO Write signal asserted properly. This gives my card the three signals it needs to accept a write request from the 1130 - XIO Write, Area 5 and T6. When those occur, the state machine proceeds through to generate the request for an interrupt at the completion of the commanded plotter movement. 

CONTINUING TESTING, USING SCOPE TO OBSERVE OUTPUTS

I used a four channel scope to capture sets of output signals from the card. The signals produced to drive the plotter are inverted logic 12V levels, the signals to the 1130 are inverted 3V levels, and some of them required pull-up resistors since the 1130 normally provides the pull-up. 

Activating the DC Reset line sets the board in its idle configuration - all six plotter outputs would be de-asserted to 12V levels, the four outputs to the 1130 would be de-asserted at 3V levels, and internally it should have the busy state turned off. I checked this first. Works perfectly. 

Sense while idle but no -24 power

Without plotter power connected, the DSW should show that the plotter is not ready. This occurred - bit 15 of the DSW is 1. 

Sense while idle with -24 power

The sense should show the plotter ready but not busy and no operation complete. Interrupt level 3 will remain high. The DSW has all bits off, which is correct, and no operation complete or interrupt request.

Trigger write requesting to move the pen up

The signal to the plotter should drop low for an appropriate time. After an additional interval the interrupt level 3 signal will drop low. For the model 1, the time for a plotter signal to cause this operation is 1.9 milliseconds, followed by a second 1.9 ms interval, all of which has the plotter indicating busy by putting a 1 in bit 14 of the DSW if a Sense Device is executed during this time. At the end of the 3.8 ms, the interrupt request for level 3 becomes 0 (inverted logic levels) and a DSW will have bit 0 turned on from this point onward. 

A 1627 model 2 will use 2.9 milliseconds for the duration of the command to the plotter and an additional 2.9 ms of busy time before triggering the interrupt request. I checked by temporarily placing a jumper on the card and verified the two durations  were correct for both model 1 and model 2. 

Sense then sense with reset issued

The sense should show operation complete (DSW bit 0) but not busy (DSW bit 14 off) and ready for further operations (DSW bit 15 off). It should only turn off the operation complete status (DSW bit 0) and interrupt level 3 will go high when the Sense with reset bit 15 is issued, not with a regular Sense Device. This worked exactly as intended. 

Trigger write requesting raising pen off paper

The raise command should do the same things as the prior write but the timing will be longer as is appropriate for raising and lowering the pen. The command to the plotter is held for 50 milliseconds, then a second interval of 50 milliseconds follows that; during the entire 100 ms, the plotter is shown as busy (by a 1 in DSW bit 14).  This is the same for either model of the plotter. I verified that this works correctly. 

Trigger write with both left pen movement and raising it off the paper

Requesting both types of movements should drop the 'left' command after 1.9 or 2.9 ms but maintain 'raise' for a full 50ms. The plotter is busy through the entire 100 ms interval. The interrupt level and operation complete only occur after the raise is complete. This was verified on the bench. 

Trigger above dual write test while -24 power is off

If -24V is off, no movement is commanded of the plotter but the interrupt request is immediately issued and the operation complete (DSW bit 0 set) is shown too. Initially I blipped the command signals to the plotter for 80 nanoseconds before my logic determined it should give an immediate operation completion. 

I decided to avoid this, thus recoding a bit of the FPGA state machine. It now proceeds immediately to completion status without toggling any of the signal lines to the plotter. 

RESULTS OF THE TESTING

The bench testing setup was fragile, but with some work it became reliable enough to perform all the tests I wanted. I had simulated all of this in Vivado previously but it is good to see the actual behavior match what I designed and expected. 

The board was inserted into the IBM 1130 in order to be put through its paces being driven by software commands and interacting with the 1130's interrupt and sense device mechanisms. I began building a connector to fit into slot N5 of gate A, compartment C1 of the 1130, with wiring that will deliver the six command signals to the plotter (pen left, pen right, drum up, drum down, raise pen and lower pen) as well has carry the -24V from the plotter that indicates to the controller that the plotter is ready to receive commands. 

I found the correct parts on Mouser to build SLT sockets to connect wiring to the backplane of the 1130. I started wiring the connector and cable before I ran out of steam today.

Thursday, May 7, 2026

Troubleshooting bench testing setup for the 1627 controller card

COMPLEX BENCH TESTING SETUP NOT WORKING PROPERLY

The setup makes use of a breadboard development system, an Arduino Uno, several power supplies, an oscilloscope and my SLT breakout box. The breadboard development system includes both 5V and adjustable power rails, plenty of breadboard space, two debounced pushbuttons, display LEDs and various types of switches. External 9V, 12V and -24V supplies round out the setup; the 9V supply powers the Arduino. 

The breadboard has open collector buffers to convert the 5V signals of the Arduino to 3V consistent with SLT logic. I didn't have any hex buffers in DIP format, so I had to wire up pairs of hex inverter chips to produce the same outcome, using pull-ups to 3V on the chips. I also used a pair of debounced pushbuttons to trigger behaviors in the Arduino. 

NOT SEEING REACTION TO WRITING TO THE PLOTTER

I watched the scope expecting to see the command lines to the plotter dip down as well as the interrupt request line go active, but there was no activity. I started debugging to see that I was properly sending the signals needed by my card - XIO Write, Area 5, T6, plus one of the B register bits. I saw T6 triggering but not Area 5 nor XIO Write. 

It was a rooky mistake. I had started serial communications just to get a bit of debugging information, but that uses pins 0 and 1 for the serial link. I had assigned those to the two missing signals. Removing the serial activity frees up pin 1, but pin 0 isn't useful on the Arduino Uno. With the removal of serial activity, I did see Area 5 going active. 

I moved the XIO Write wire to pin 12 and changed my Arduino code, but it did not activate. I even checked the wire for continuity and put that wire directly to a scope lead without any connection to the breadboard - still no sign of life. 

The Arduino I used was an old one I pulled out of a parts bin - one that had been used for prior projects. Just in case there is something wrong with it, I ordered a new Uno which I can swap in. Until I can pulse the XIO Write line, the board will not do anything meaningful. 

Wednesday, May 6, 2026

Modified plotter controller card

CORRECTED FOR BAD FOOTPRINT FOR THE FPGA DAUGHTER CARD

As previously discussed, the position of pins segments J3 and J4 were swapped on the footprint, leading to several problems. Most serious was swapping +5V and ground power inputs, but we also had signals routed to different pins than were expected in the FPGA code. 

BODGE WIRING

I swapped the power lines and also connected jumper wires from pins where the FPGA had analog inputs to other pins that were suitable for digital output. 


CONVERTED FPGA CODE

I adjusted to code to use the pins to which the traces are currently connected rather than the ones I intended, which allows me to use the board now. 

Testing the new controller card for the 1627 plotter on the bench

REPAIRED DETACHED CONNECTOR FOR PIN G02

The connector that was pushed back off the PCB needed to be reattached. I removed the plastic covers, then soldered that connector back in place by hand. I used a clamp to hold the connector down at the front and applied the soldering pencil tip further back to melt the solder underneath and make it flow.

I noticed that the metal pad had been peeled back, validating the theory that the connector had been mechanically sheered backwards as it was inserted into a socket. I didn't like the shape of the connector, so I switched to another that was in better shape. The card fits into sockets and the connector seems to be holding in position. 

BENCH TESTING

I have a test jig where I can plug in SLT cards (including my substitute card for this project) and get access to the signals on the various pins. By supplying this with +12V power and appropriate signal states, I should be able to test out the behavior of the card on the bench. The outputs are connected to oscilloscope probes in order to view the action of the board. 

FIRST CHECKS DONE

I brought up power to verify the voltage regulator and lack of excess drain. I immediately discovered that I had to +5 and ground connections to the FPGA board reversed. I removed the pins and installed jumper wires to power the CMOD S7. 

The command lines to the plotter are inverted logic and had the expected 12V level when they are not asserted. The detection circuit that tells my logic whether the plotter's -24V is active (when the plotter is cabled up and switched on) did give a logic high 3.3V when the -24 power supply was switched on and a logic low when it is off. 

DRIVING THE BENCH TESTING

I grabbed an Arduino and programmed it using direct port access because that gave me more precise timing for the output control signals from the Arduino that drive my plotter card - 500 nanoseconds per port manipulation which is close enough to an 1130's T clock steps that I could mimic the timing well enough to test out my card. The Arduino will drive the inputs to my card. 

// port D bits 0 to 7 below
#define XIOW 0
#define A5 1
#define T6 2
#define XIOS 3
#define XIOS15 4
#define DCRESET 5
#define B0 6
#define B1 7
// port B bits 0 to 3 below
#define B2 8
#define B3 9
#define B4 10
#define B5 11
// reuse analog inputs as digital inputs for control
#define resetit 14
#define doup 15
#define doraise 16
#define sense 17
#define sensereset 18
#define doboth 19

void setup() {
  pinMode (XIOW, OUTPUT);
  pinMode (A5, OUTPUT);
  pinMode (T6, OUTPUT);
  pinMode (XIOS, OUTPUT);
  pinMode (XIOS15, OUTPUT);
  pinMode (DCRESET, OUTPUT);
  pinMode (B0, OUTPUT);
  pinMode (B1, OUTPUT);
  pinMode (B2, OUTPUT);
  pinMode (B3, OUTPUT);
  pinMode (B4, OUTPUT);
  pinMode (B5, OUTPUT);
  pinMode (resetit, INPUT);
  pinMode (doup, INPUT);
  pinMode (doraise, INPUT);
  pinMode (sense, INPUT);
  pinMode (sensereset, INPUT);
  pinMode (doboth, INPUT);
  // DCRESET is inverted, true when low
  digitalWrite(DCRESET, LOW);
  // below control inputs are standard, true when high
  digitalWrite(XIOW, LOW);
  digitalWrite(A5, LOW);
  digitalWrite(T6, LOW);
  digitalWrite(XIOS, LOW);
  digitalWrite(XIOS15, LOW);
  // below control inputs are inverted, true when low
  digitalWrite(B0, HIGH);
  digitalWrite(B1, HIGH);
  digitalWrite(B2, HIGH);
  digitalWrite(B3, HIGH);
  digitalWrite(B4, HIGH);
  digitalWrite(B5, HIGH);
  delay(500);
  // release the reset from the board
  digitalWrite(DCRESET, HIGH);
}

void loop() {
  // process any button pushes
  if (digitalRead(resetit) == HIGH) {
    // hold reset for half a second then release
    digitalWrite(DCRESET, LOW);
    delay(500);
    digitalWrite(DCRESET, HIGH);
  } else if (digitalRead(sense) == HIGH) {
    // simulate the 1130 executing an XIO Sense Device for plotter
    // one memory cycle (8 T clock steps)
    PORTD |= (1 << 3); // XIOS
    PORTD |= (1 << 1); // A5
    PORTD |= (1 << 1); // A5
    PORTD |= (1 << 1); // A5
    PORTD |= (1 << 1); // A5
    PORTD |= (1 << 1); // A5
    PORTD |= (1 << 1); // A5
    PORTD |= (1 << 1); // A5
    PORTD |= (1 << 1); // A5
    PORTD &= ~(1 << 3); // ~XIOS
    PORTD &= ~(1 << 1); // ~A5
  } else if (digitalRead(sensereset) == HIGH) {
    // simulate an XIO Sense Device with reset bit 15 turned on
    // one memory cycle (8 T clock steps)
    PORTD |= (1 << 3); // XIOS
    PORTD |= (1 << 1); // A5
    PORTD |= (1 << 4); // XIOS15
    PORTD |= (1 << 1); // A5
    PORTD |= (1 << 1); // A5
    PORTD |= (1 << 1); // A5
    PORTD |= (1 << 1); // A5
    PORTD |= (1 << 1); // A5
    PORTD &= ~(1 << 3); // ~XIOS
    PORTD &= ~(1 << 4); // ~XIOS15
    PORTD &= ~(1 << 1); // ~A5
  } else if (digitalRead(doup) == HIGH) {
    // simulate an XIO Write with B Bit 2 set (move pen up)
    // one memory cycle but only activates at T6 clock step
    PORTD |= (1 << 0); // XIOW
    PORTD |= (1 << 1); // A5
    PORTB &= ~(1 << 0); // ~B2
    PORTB &= ~(1 << 0); // ~B2
    PORTB &= ~(1 << 0); // ~B2
    PORTB &= ~(1 << 0); // ~B2
    PORTD |= (1 << 2); // T6
    PORTD &= ~(1 << 2); // ~T6
    PORTD &= ~(1 << 0); // ~XIOS
    PORTD &= ~(1 << 1); // ~A5
    PORTB |= (1 << 0); // B2
    // wait 1 millisecond then execute XIO Sense Device
    delay(1);
    PORTD |= (1 << 3); // XIOS
    PORTD |= (1 << 1); // A5
    PORTD |= (1 << 1); // A5
    PORTD |= (1 << 1); // A5
    PORTD |= (1 << 1); // A5
    PORTD |= (1 << 1); // A5
    PORTD |= (1 << 1); // A5
    PORTD |= (1 << 1); // A5
    PORTD &= ~(1 << 3); // ~XIOS
    PORTD &= ~(1 << 1); // ~A5
  } else if (digitalRead(doraise) == HIGH) {
    // simulate an XIO Write with B Bit 5 set (raise pen off paper)
    // one memory cycle but only activates at T6 clock step
    PORTD |= (1 << 0); // XIOW
    PORTD |= (1 << 1); // A5
    PORTB &= ~(1 << 3); // ~B5
    PORTB &= ~(1 << 3); // ~B5
    PORTB &= ~(1 << 3); // ~B5
    PORTB &= ~(1 << 3); // ~B5
    PORTD |= (1 << 2); // T6
    PORTD &= ~(1 << 2); // ~T6
    PORTD &= ~(1 << 0); // ~XIOS
    PORTD &= ~(1 << 1); // ~A5
    PORTB |= (1 << 3); // B5
    // wait 1 millisecond then execute XIO Sense Device
    delay(1);
    PORTD |= (1 << 3); // XIOS
    PORTD |= (1 << 1); // A5
    PORTD |= (1 << 1); // A5
    PORTD |= (1 << 1); // A5
    PORTD |= (1 << 1); // A5
    PORTD |= (1 << 1); // A5
    PORTD |= (1 << 1); // A5
    PORTD |= (1 << 1); // A5
    PORTD &= ~(1 << 3); // ~XIOS
    PORTD &= ~(1 << 1); // ~A5
  } else if (digitalRead(doboth) == HIGH) {    
    // simulate an XIO Write with two B bits set
    // B Bit 5 (raise pen off paper) and B Bit 4 (move pen left)
    // one memory cycle but only activates at T6 clock step
    PORTD |= (1 << 0); // XIOW
    PORTD |= (1 << 1); // A5
    PORTB &= ~(1 << 3); // ~B5
    PORTB &= ~(1 << 2); // ~B4
    PORTB &= ~(1 << 3); // ~B5
    PORTB &= ~(1 << 2); // ~B4
    PORTD |= (1 << 2); // T6
    PORTD &= ~(1 << 2); // ~T6
    PORTD &= ~(1 << 0); // ~XIOS
    PORTD &= ~(1 << 1); // ~A5
    PORTB |= (1 << 3); // B5
    PORTB |= (1 << 2); // B4
    // wait 1 millisecond then execute XIO Sense Device
    delay(1);
    PORTD |= (1 << 3); // XIOS
    PORTD |= (1 << 1); // A5
    PORTD |= (1 << 1); // A5
    PORTD |= (1 << 1); // A5
    PORTD |= (1 << 1); // A5
    PORTD |= (1 << 1); // A5
    PORTD |= (1 << 1); // A5
    PORTD |= (1 << 1); // A5
    PORTD &= ~(1 << 3); // ~XIOS
    PORTD &= ~(1 << 1); // ~A5
  } // do nothing if none of the buttons were pushed
}

For example, asking the plotter to move the pen is done by issuing an XIO Write instruction to the plotter device (area code 5) and setting on bits 0 to 5 of the data word to request pen left, right, up, down, raise and lower commands. In the 1130, one 3.6 microsecond memory cycle is when the controller card sees the XIO Write by means of signals +XIOW and +A5 that are high for the entire memory cycle. During one T clock step of that cycle, signal +T6 is high. The data word is sitting in the machines B register thus my card sees signals -B Bit0 thru -B Bit 5

To see the status of the plotter, a programmer issues an XIO Sense Device to the plotter and receives back a data word where bits are assigned specific status conditions by the controller card. The card sees +XIOS and +A5 for a memory cycle, at which time it turns on B bits 0, 14 or 15 based on the conditions of the plotter as determined by my controller card. My card has to pull down lines -DSW0-DSW14 and/or -DSW15 based on the conditions it is reporting. The XIO Sense Device can take place while the plotter is still moving the pen, before any movement has been requested, or after the movement is complete. 

If a particular bit in the command word for the XIO Sense Device is set (bit 15) then the controller card will turn off its request for the 1130 to be interrupted (on interrupt level 3). When a movement is completed, the controller card turns on the interrupt request and maintains that until an XIO Sense Device with reset bit 15 is executed. 

My board has six inputs that I wire to pushbuttons or slide switches on my breadboard bench testing device:

  • Put the controller card in reset, as if the 1130 has powered up or has RESET pushed
  • Issue an XIO Write to move the pen up
  • Issue an XIO Write to raise the pen
  • Issue an XIO Sense Device
  • Issue an XIO Sense Device with reset bit 15
  • Issue an XIO Write to move the pen up and raise it

I installed two open collector hex buffer chips on the breadboard so that the +5V outputs of the Arduino become compatible with my cards logic levels (0 and 3) with a pullup resistor to +3V. These run to the pins of the controller card. 

Four of the outputs of my card need a +3V pullup resistor, which I put on the breadboard. The other outputs of my card operate with logic levels of 0 and 12V. One special input of my card takes -24V which would be delivered by the 1627 plotter when it is powered on, through a 3.9K resistor which I put on the breadboard. 

I set up the scope to monitor some of the outputs and inputs, so that I could verify that the controller card works according to spec. Once it is all verified, I can plug it into the 1130 and test with my physical Calcomp 565 plotter which is the same as the IBM 1627. 

If the 1627 plotter is not hooked up (or powered down), then an XIO Sense Device should not pull down -DSW15. Any XIO Write request should immediately turn on the interrupt request and pull down -DSW0 for any XIO Sense Device. There should be essentially zero delay. I then hooked up the -24V to the board and moved on.

The function pushbutton doup will issue an XIO Write requesting an up pen movement. The -Up signal drops from its regular state +12V for 1.9 milliseconds. Within a millisecond, the card sees an XIO Sense Device and will drop signals -DSW14 and -DSW15 to zero for one memory cycle. 

After 3.8 milliseconds, the -Interrupt Level 3 request will drop to zero and stay there. Pushing the sense button should cause signals -DSW0 and -DSW15 to drop to 0 for one memory cycle. 

Pushing the sensereset button will return the same but turn off -Interrupt Level 3 and subsequent sense receive only -DSW15

Pushing the doraise button is similar to what occurs with doup, however the signal -raise is held low for 50 ms and only after 100 ms will -Interrupt Level 3 drop to zero. 

The button doboth will simultaneously request moving the pen left and raising the pen. The -left signal should go low for only 1.9 ms but the -raise signal should stay down for a full 50 milliseconds. Only at the end of 100 ms should the -Interrupt Level 3 drop low. 

Pushing the resetit button will reset the card to its default state. That would turn off the -Interrupt Level 3 line and any commands to the 1627. 

DISCOVERED A MAJOR FLAW IN THE PCB DUE TO A DEFECTIVE FOOTPRINT

Once I attempted some tests I discovered the reason that my +5V and ground connections were backwards. The footprint I used with KiCad has reversed the position of some of the banks of pins. 

As you can see above, banks J3 and J4 do correctly position the +5V pin (24) and the ground pin (25) they way I had to rewire them. My footprint had J4 at the bottom right and J3 at the top right, thus reversing where the +5 and ground pins sat. It also meant that my PCB wired signals to J4 when I intended them to be wired to J3 based on the digital I/O pin numbers 16-23. 

QUICK AND DIRTY REWIRING AND REGENERATION OF FPGA LOGIC

In order to proceed with testing, I altered the configuration file for the CMOD S7 to put my signals on pins 25-31 so that they were picking up what was routed to the top right connector, since the footprint swapped the pin numbers for the right side. Because pins 32 and 33 are analog inputs, I removed the pins from the CMOD board and then added jumper wires to carry the signals down to what the footprint thinks are pins 16 and 17. 

I only had to reroute signals on the PCB from 32/33 to 16/17, as well has swapping +5V and ground, in order to have accessibility to all the signals. I then changed the configuration file for the FPGA to make use of the actual pins where the signals were connected, which made everything right for now. 

I will have to redo the PCB with a repaired footprint in order to have future builds work properly, as well as regressing the configuration file changes, but I can make use of this board with bodge wires without needing to fab and put parts on a new version of the PCB. 

CORRECTED INVERSION OF 1130 OUTPUTS

My testing showed that the outputs to the 1130 -IntLvl3, -DSW0, -DSW14 and -DSW15 were being emitted by my FPGA code as inverted logic but the open collector inverter chip on the PCB was flipping it back to high when asserted. I changed the FPGA code to emit high when asserted, thus the PCB will produce the inverted values needed.