-
Side Tracked
06/01/2020 at 05:02 • 3 commentsI got side tracked for a bit. I have a 16 bit alu wired up. Its not the most photogentic project. To simplify working I made a stack of PCB board with AM2901 chips. The common signals travel vertically via stacking headers. This still needs fully tested.
I am still hung up on how I will setup the Microcode seqencer. I have in my possession all three options for AM2909, AM2910 and AM2910 chips. The current issue I am running into is the microcode map (ROM) for using 8 bit instruction requires memmory with 8 address lines and 12 data lines.
In other news I found a write up via Dangerous Prototype, Ken Shirriff did a post on the internal silicon of the AM2901. Found here: http://www.righto.com/2020/04/inside-am2901-amds-1970s-bit-slice.html
-
Side Notes
03/28/2020 at 05:14 • 0 commentsJust a couple of side notes.
Technically the AM2901 can be wired an used as a universal shift register offering both parallel and serial loading along with parallel and serial outputs. It is strangely possible to operate to serial streams shifting in at the same time. You would only be able output one value in parallel at a time. The controlling for this would be slightly akward. It is also possible to work with with this chip as a up/down counter with preload.
Doing either of these would be both expensiveand a waste of a more functional chip. -
Day 4
03/25/2020 at 04:44 • 0 commentsSpent some time writting micro op setup for testing chips. I went through my personal collection of chips and they all passed.
---------- more ----------Code
clear_regs(0); Serial.println(" Reqister Q"); // check q register Micro_Op(DO, 0, REGQ, 0, 0, 0, 1); // Set Q Micro_Op(OQ, 0, RAMQU, 0, 0, 0, 0); // Shift Q up Micro_Op(OQ, 0, RAMQU, 0, 0, 0, 0); // Shift Q up Micro_Op(OQ, 0, RAMQU, 0, 0, 0, 0); // Shift Q up Micro_Op(OQ, 0, RAMQU, 0, 0, 0, 0); // Shift Q up Micro_Op(OQ, 0, RAMQD, 0, 0, 0, 0); // Shift Q Down Micro_Op(OQ, 0, RAMQD, 0, 0, 0, 0); // Shift Q Down Micro_Op(OQ, 0, RAMQD, 0, 0, 0, 0); // Shift Q Down Micro_Op(OQ, 0, RAMQD, 0, 0, 0, 0); // Shift Q Down Micro_Op(DO, 0, REGQ, 0, 0, 0, 15); // Set Q Micro_Op(DO, 0, REGQ, 0, 0, 0, 10); // Set Q Micro_Op(DO, 0, REGQ, 0, 0, 0, 5); // Set Q Micro_Op(DO, 0, REGQ, 0, 0, 0, 0); // Set Q // check ram for (int i = 0; i <= 3; i++) { Serial.println(" "); Serial.print(" Ram "); Serial.println(i, HEX); Micro_Op(DO, 0, RAM, i, i, 0, 1); // Set Reg[0] Micro_Op(OA, 0, RAMQU, i, i, 0, 0); // Shift Ram up Micro_Op(OA, 0, RAMQU, i, i, 0, 0); // Shift Ram up Micro_Op(OA, 0, RAMQU, i, i, 0, 0); // Shift Ram up Micro_Op(OA, 0, RAMQU, i, i, 0, 0); // Shift Ram up Micro_Op(OA, 0, RAMQD, i, i, 0, 0); // Shift Ram Down Micro_Op(OA, 0, RAMQD, i, i, 0, 0); // Shift Ram Down Micro_Op(OA, 0, RAMQD, i, i, 0, 0); // Shift Ram Down Micro_Op(OA, 0, RAMQD, i, i, 0, 0); // Shift Ram Down Micro_Op(DO, 0, RAM, i, i, 0, 15); // Set Reg[0] Micro_Op(DO, 0, RAM, i, i, 0, 10); // Set Reg[0] Micro_Op(DO, 0, RAM, i, i, 0, 5); // Set Reg[0] Micro_Op(DO, 0, RAM, i, i, 0, 0); // Set Reg[0] } for (int i = 0; i <= 3; i++) { Serial.println(" "); Serial.print(" Ram PortB "); Serial.println(i, HEX); Micro_Op(DO, 0, RAM, 0, i, 0, 15); // Set Reg[0] Micro_Op(OB, 0, RAM, 0, i, 0, 0); // Set Reg[0] Micro_Op(DO, 0, RAM, 0, i, 0, 10); // Set Reg[0] Micro_Op(OB, 0, RAM, 0, i, 0, 0); // Set Reg[0] Micro_Op(DO, 0, RAM, 0, i, 0, 5); // Set Reg[0] Micro_Op(OB, 0, RAM, 0, i, 0, 0); // Set Reg[0] Micro_Op(DO, 0, RAM, 0, i, 0, 0); // Set Reg[0] Micro_Op(OB, 0, RAM, 0, i, 0, 0); // Set Reg[0] }
-
Day 3
03/24/2020 at 21:53 • 0 commentsMore frustrations today. Nothing seems to work when using Port B as a source. I broke down are wrote and made an automated program to scan through the possible 3 micro op combanations to preform:
Set Ram[0] to 3
Set Ram[3] to 4
RegA[0] + RegB[3].
I knew from yesteraday that Source 7 (Data port, Zero) ) would allow me to write to ram. The program I set up would clear all of the Ram contents and the Q register Set ram locations 0 and 3 then try every combination of sources and destinations. It would report back if the results matched.This did not go well.
After hours of trouble shooting and chip swapping I found the problem. The 5 volt supply off the Arduino was not strong enough for the AM2901 and was being dragged down to ~4 volts.
Powering the AM2901 off of a seperate power supply fixed the issue. -
Day 2
03/24/2020 at 21:26 • 0 commentsOne my first day at this I was able to communitcate with the chip and access some of the functioanlities. A lot of this was achived by straight out brute forcing the inputs of the chip and watching the result. While this was time consuming I did confirm functinallity of a few micro ops.
This was done by setting the function to 0 for add and setting the carry pin high. I would set the source and destination values that I wanted to check with A port and B port 0. Then just pulse the clock. With certain settings this should create a counter. This was charted out on a spread sheet and varifed against the AM2901 data sheet.
I was able to determin how to read and write to the ram and the Q registers doing this. Functions using the B address port of ram seem flakey. More brute forcing is envolved.
-
Day 1
03/24/2020 at 18:50 • 0 comments
Wiring up the AM2901 to the Arduino Mega and getting a responce. To start out I have only wired access to 2 of the address lines for the registers. The output port from the AM2901B was held enabled.Wiring
Mega AM2901 2,3
4,5
6
7A0,A1
B0,B1
Clock
Carry in14,15,16,17 Data Out (Y) 30,31,32 ALU Source 33,34,35 ALU Function 36,37,38 ALU Desitnation 50,51,52,53 Data In (F) RAM0 to RAM3 Q 0 to Q 3 Held High A2, A3
B2, B3Held Low F output enable. Bit order for ports do not follow pin order